From nobody Tue Dec 16 13:27:27 2025 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013035.outbound.protection.outlook.com [40.107.159.35]) (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 21D902D7386; Wed, 3 Dec 2025 09:00:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.35 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752423; cv=fail; b=Dxhni+xgsFHGLpAbqjbkhbyswQEMT52OKD1aHMaTwcY9CgLwTncQCAnYO9cDY04urxqPTBZzv/ZxkGm4XHTQjVGegyrUOzk9oHbLDJ+mepOU08C0XQB2l9z64pYiyUtoL4LASqBJmNJiIGhl9cZ68oznv7S47aWDEAb5fPSsvV8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752423; c=relaxed/simple; bh=oyI9WTwZ6g80BN1s7P0Cyb73CWhE2fgJL8qtM1k4S9o=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=DnTKdr+aN61aOtjjhaB1FPYHuCIibNMUArCqX/79nCMQVWjxGr3l2oYYlMy/dC0UiKeRkfdZdb91FgxfV0aIfezmWN/SJBICCluKJQqnx8zqTE5ukbq2SB4PGZRXarUpR8eASa3Rt817b2tBg+lVTznvJkB9xeu8krhQURTVyHI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=S2xl6A50; arc=fail smtp.client-ip=40.107.159.35 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="S2xl6A50" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RjWL4h8ypXCx1S39ORX3TIVId8ms9K8BZm7L4qlZJPw9Wv/B93B3+Z8HxNVUH+ccI5jfqVbtrrY4hZ7c2d+UlX9f8TqEysuX+v8YCLhDuZvU9Vu1QeQhOhYNdLxIirba8KnpVHw7QJ1SAeScH3ohy3K6OZpmVfykr29xFP0Sz/QCAe3H+52zXUPhjbNwCDN7Vi8SxnVpYke3FmRh4ttoEtnoeVAtNVXw8y2HXNkprvgMl/E6KyQAqNLncQDxBNCMrkYaLIPjZp2P0RfbK1hAdJOQtsPi+dwNvxN/o3jh8LI4OqBGWSeeDFwLU6Jf+uTnJel3PFVomACYaVadiwU+8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=BBl7SPpwDmJwl3W407WH9B6rJ2WP4FW7gw9m2ThH9F4=; b=ufBlPcJX08wzf3Ybb7fPmYz52eoc6p+Um1eIccT89LbuUATgG3XZINj+sxpwBLmTWD4/G77Ns/dy1B8OB1eHouElj7tJ66FZWfQmK5r8h9v6BJdWWy+xGXAVg1gysBClGHJFP/l6Dya89vPfrLTBb+Ws7vUaUqDawD4eew3XxfyGUSaVyMJqeoGz9frXl4aP2gkbHKfgDtul9JFE2/9H0D5l6Ln9WyYHPRmGPEG+44DwdR8k9GztwW9r9YBkcfsO3DRyI4gYGdtMKvu3gcQcxD8KAh/bT+fgX0MlMoQV1BYsCx8ieJDOr/vcyL+jGuw7NC3Y14F5mvlD5LLOI5NEvg== 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=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BBl7SPpwDmJwl3W407WH9B6rJ2WP4FW7gw9m2ThH9F4=; b=S2xl6A50z9zsm8EL2sHegGw+mMx//Qznrfz1loSfqbyX25jO6djYcK9fALShcneJGI3ng+64DayPZJg1Ikyv+ctKjluOWm9TcBNEBAg0wnBKugKumA8pZpA53kn+/dlLl3GylV9LCPZLanHSTk/4lT4moM+bor+0xe/u+InH8GTYE1EH6RXGjzy5kGY0NMGfmGxAWdDIk8t/gMYUDKYNJW+XOWo+CyOmM9rpGH0UgTJYW4SIgxuiHsVNCpo6lqGKDIAUYU/PJztrq504dpeftjhJftXT1+iuniKaWGtXES3tcuKnasbUEmGekEKYgHdkbVqxgiGGfQ4xtTcM4awRCQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by PA4PR04MB9663.eurprd04.prod.outlook.com (2603:10a6:102:261::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9388.9; Wed, 3 Dec 2025 09:00:17 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9366.012; Wed, 3 Dec 2025 09:00:17 +0000 From: Carlos Song To: frank.li@nxp.com, mkl@pengutronix.de, broonie@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, kees@kernel.org, gustavoars@kernel.org Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Carlos Song , Frank Li Subject: [PATCH v3 1/6] spi: imx: group spi_imx_dma_configure() with spi_imx_dma_transfer() Date: Wed, 3 Dec 2025 16:59:44 +0800 Message-Id: <20251203085949.2922166-2-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251203085949.2922166-1-carlos.song@nxp.com> References: <20251203085949.2922166-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0P190CA0017.EURP190.PROD.OUTLOOK.COM (2603:10a6:208:190::27) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|PA4PR04MB9663:EE_ X-MS-Office365-Filtering-Correlation-Id: 332284ae-3d37-4cd6-4e52-08de324a60db X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|1800799024|366016|19092799006|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ODyqLrAdGEyLbt/AyIoQGh7gcpmnjR9hci+KvAGZIDM6rKUoO+cjQbh/5M/q?= =?us-ascii?Q?ywu0GGvCo4Ui4gPXY8dNwlx+Il2osRKdR4A7H78WpFXWhwYTvA6eUzc89bmn?= =?us-ascii?Q?oSCyWTZuYGkqJwGXFg3xLoUabFEMyejOvxKi2b1YaATBwK31sl8eyv+u355r?= =?us-ascii?Q?xF7LqhJVIceaxOC0ZfyltwZl9WAHAPQmyDivtOFGrE08HD+JEsOzVmh/E+Sm?= =?us-ascii?Q?zbbBnC6Ht9ydR9bRCE2lLBGxoJtA4aXnCTmMzlcSu0NVQjex8xLYdxCcRVCg?= =?us-ascii?Q?uEggkSRMQmXtcLXrI1x4XF3ylC40rsBFwQtY56dib9eZhAiQwckuyWROvOsL?= =?us-ascii?Q?bou3zP52ncOYCIX5NYvVRt0ODHb2dF4eVAjphmWsxG18Xf0LjaqLsNT1Y0LZ?= =?us-ascii?Q?sbNSneQ/odbCUD7Sab8Q6EkimnfGaYup23K8ecpunXZxI8vUioQTfhJxlyjE?= =?us-ascii?Q?ax7pWZVeFwBzC+yj4g+ivgYrTw4gFHWVO6MLQCmdNhJ4BkyeCQMeBC9LA4D+?= =?us-ascii?Q?IQ+h8o2n5H/K22VZwvMbF4ff6rRcqLAlZgEnIOVXPaOSJ1cKcrVaU/ahCJcA?= =?us-ascii?Q?MqO77U83VRmozE4DoHWdxhQwzTucjEcexbZHkhYAj3UB/26QFtOZCBPNAXYF?= =?us-ascii?Q?YJLsRg/ud6gw3idGAMEXWig6Dd5HrS2tdSX+69UR5hA3bZpyoxAOYLsu28fR?= =?us-ascii?Q?WyumtiU568+LisrbzsFpXAMxD09SbaLLRY/81rva2CdQ8FD0SYCTdwzM1uZ6?= =?us-ascii?Q?fK1EJ6z/JAhbIZtyH/8dn/oHpraDQ2ZXYy78chzA8HxEMfKRtZD5GF9a4igb?= =?us-ascii?Q?fyQpbunibi/50DvVEVpKOrKSolMX43aZ8cZyK0bl2Q156FeQC5ZXiW0RSXqq?= =?us-ascii?Q?XaUvkHQdKeiZWOY6grPlkgNUfaILim9MMl6dpqXUHE3LUoLz3FY2HeX8uI5m?= =?us-ascii?Q?l6kGzbkwUNOl5dlhmAbWqhPNugJSHvt8RjMCFgCI5HCHooO16z7hoPnxaK8N?= =?us-ascii?Q?Y3CSXEJUiR6euGlBwbPXYzTLknu+zEcN6Gw9WPbqLBSTz8eHuLt+QjPqszBC?= =?us-ascii?Q?XeRCwCZzSXsYQbenC11UZ4KK2cNFNhUVV8hHt/qLNwOz9v9XHE+acya7i4HT?= =?us-ascii?Q?6f6X0ojy5bkzEX6TdMcUH1wjVb5S5BroaB2u0MLoCCju+x9EQaljNx1W6czL?= =?us-ascii?Q?XDJriWKD7RYqMIRbQsvVeeK/kZwa5s6vBV5n3THdTYbyY+/QVVjOxantQZ8w?= =?us-ascii?Q?G0d2DqgFIFA+o79DlVsqe2Yom7wYGTo5KSJonCm/tt1n8/5FPVqlbIRzWbAg?= =?us-ascii?Q?sofDYnpRMQxwaxa42xGBdJXIkBCq0WRov5D8b6rnDQU3XPlEjHsEGumN/0CF?= =?us-ascii?Q?tI5F/iCJ7XpAiemqQOTMsKulVZEqO4iySsBttUsTZfCMGeBZDrTUvVGRwhua?= =?us-ascii?Q?FN+qCq4MeC6+6Oksr2XBZz1bZH9qicwRm/YahOWERM2HcYBLtZRqA4fLNJGT?= =?us-ascii?Q?0i7glmjebmrIXlhP/OkhgCvyjSXnjIVXsPby?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(1800799024)(366016)(19092799006)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?n4R4JdCBjKTu9jPNVs6sjqw/DMjVgTUOwzTGc+dqeLMKoEjZg+Xt8yVVcKTy?= =?us-ascii?Q?VwcWe4r8ZawezmgVGp1ldK0++8gpUorNNIQNSnZPx8/KxCxyBNJ2DKg2KN0O?= =?us-ascii?Q?9X7IwNoaBESKqNiWMf08fhWl0rn+0S4TQN1zMrSwUQOyvoh+Msc9ldZKBBvc?= =?us-ascii?Q?JW7fGXcIlk+dAhDq+8XJODINtLV5GCYU6US6z3Gd8VwneRPrO+Tmruo6EoMy?= =?us-ascii?Q?u2IlhDEm80WoSIB/qMh3cfatUZgNwbWrJrrrHj2Av3+6/LYGWUK+teQv7w1J?= =?us-ascii?Q?vBzdWrWxxWE8Z1Rpsj91LBbndQt7ebcV1nIjSmr1X35zj1St82v9zySjOxFJ?= =?us-ascii?Q?CDsyHuKi2Lk3pGlo4y+FXj9b+PZR7DUEEFRsDW7m27DRkqQQbUJyFzWLKFTE?= =?us-ascii?Q?2Vls0JXll1iXQzEibfrEzkM5Zoyl0jAXsmJk+Ioi0QPvdUhFrxixeZq9PEuE?= =?us-ascii?Q?0vyVA/QzyjBQV4wOfOzFbh8kMcFYmhkzy/fBT4VQoJKEEIe+C8zu4KXnUwPq?= =?us-ascii?Q?I2SYwyKJP6nQmvUBmBSvZJvFQ5jnY7GrPFYjNHu/RLGZINhg6Kl3FRxc/KnE?= =?us-ascii?Q?qkG5VVAKctott6zmfbRUmiUjxnRZObxbHkvFWKNd7wIz/C2CEeNVaiVgcW3w?= =?us-ascii?Q?VQkAf2EIT46uHQX+0qfdgyAfJaxd4u4nOKc+RDxAB92UdN01BLgN1hMo517S?= =?us-ascii?Q?1Pc/x5s7d9QOtrLTFXSqJLnwWfQ5Dv0gcYUVwqeFB6h7D0RAyQw96DgCVP97?= =?us-ascii?Q?sGcr3yuvsk2u4d55tjK0dIlLL6hT7laakXBuz32w66K2shY0ON9yVyxNI4CW?= =?us-ascii?Q?MJnt0Wa79H7UJEmWhjohEvvTS9e7xHGUtFwE50YQe29dRX+5M1PFWL5ttsSJ?= =?us-ascii?Q?it9QHEGd3x06Jo2SQrPA+dQQhCtsVLI+eeJk4ngMEpT7F8b19AvN3P5xke17?= =?us-ascii?Q?EpG64u4LQ5XRIUAA/vesc86Hj1D+t8HzMvv1Il7E8w/HSOdKZeRWw7XgnySz?= =?us-ascii?Q?zq4PmDGw9ME2WKE8lZupggkkY+q1KBHIHdxNP8FeAwmURqMN+GueFCKkrK7Y?= =?us-ascii?Q?USr0k3GpEspfO2NZL/Ya/bLGP3b81xxpCOQkkqlDMQU4rXXlqcvIMFmcZt+Z?= =?us-ascii?Q?+07i2HWC8osaen3GzlwGAFIKH7DdjztduZlDoHCUqUK9+lYX/nBZNm7knnDw?= =?us-ascii?Q?/eXoObMHPL0q9cld0DCi4DdP2IB8s4fR1QwhmfvJQqhzlBSVWVWQd2+9HCzS?= =?us-ascii?Q?MZuIb9qo8n/AE9IuRdRHM/b9Luc8JGI2Pbhan2t8HAtPU9mjux3dxssc7LqK?= =?us-ascii?Q?JYnCYa4ZOmw27FscmNio91NSLutFhO3ZOPq93NzExOhbg1L8epxD3oCz954I?= =?us-ascii?Q?btu4oFFHkWLvze3LhDlzdIhK3nPCaRIaf4SkA5WjnGMwzrl8U7bCEA6HsqH8?= =?us-ascii?Q?WjAZ33jeb9YasmJMkSqRBmFUmOsHsBLVJFBBCd+A+0XRkn1HxASBCCOyHMjI?= =?us-ascii?Q?TvO5N5aPNVT9SWCGt7vS1hCzTtm6/o+B1Tbm7crSL4FPpdD+HaCwxNvGJSh7?= =?us-ascii?Q?B5lY0pfu5CKzDCGHoDVyh84ir+NmuabnoGyaF6sS?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 332284ae-3d37-4cd6-4e52-08de324a60db X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Dec 2025 09:00:17.1285 (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: NMW4hmUAifh6JvLqcHTIKIzqqj0MtpozG0v/Sn0h+gHmBhHJT1Wxcj4ibml4a+Rpr8fAgAIKTy1Q5+yZYyTWiQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR04MB9663 Content-Type: text/plain; charset="utf-8" Relocate spi_imx_dma_configure() next to spi_imx_dma_transfer() so that all DMA-related functions are grouped together for better readability. No functional changes. Signed-off-by: Carlos Song Reviewed-by: Frank Li --- drivers/spi/spi-imx.c | 88 +++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index b8b79bb7fec3..e78e02a84b50 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -1282,50 +1282,6 @@ static irqreturn_t spi_imx_isr(int irq, void *dev_id) return IRQ_HANDLED; } =20 -static int spi_imx_dma_configure(struct spi_controller *controller) -{ - int ret; - enum dma_slave_buswidth buswidth; - struct dma_slave_config rx =3D {}, tx =3D {}; - struct spi_imx_data *spi_imx =3D spi_controller_get_devdata(controller); - - switch (spi_imx_bytes_per_word(spi_imx->bits_per_word)) { - case 4: - buswidth =3D DMA_SLAVE_BUSWIDTH_4_BYTES; - break; - case 2: - buswidth =3D DMA_SLAVE_BUSWIDTH_2_BYTES; - break; - case 1: - buswidth =3D DMA_SLAVE_BUSWIDTH_1_BYTE; - break; - default: - return -EINVAL; - } - - tx.direction =3D DMA_MEM_TO_DEV; - tx.dst_addr =3D spi_imx->base_phys + MXC_CSPITXDATA; - tx.dst_addr_width =3D buswidth; - tx.dst_maxburst =3D spi_imx->wml; - ret =3D dmaengine_slave_config(controller->dma_tx, &tx); - if (ret) { - dev_err(spi_imx->dev, "TX dma configuration failed with %d\n", ret); - return ret; - } - - rx.direction =3D DMA_DEV_TO_MEM; - rx.src_addr =3D spi_imx->base_phys + MXC_CSPIRXDATA; - rx.src_addr_width =3D buswidth; - rx.src_maxburst =3D spi_imx->wml; - ret =3D dmaengine_slave_config(controller->dma_rx, &rx); - if (ret) { - dev_err(spi_imx->dev, "RX dma configuration failed with %d\n", ret); - return ret; - } - - return 0; -} - static int spi_imx_setupxfer(struct spi_device *spi, struct spi_transfer *t) { @@ -1481,6 +1437,50 @@ static int spi_imx_calculate_timeout(struct spi_imx_= data *spi_imx, int size) return secs_to_jiffies(2 * timeout); } =20 +static int spi_imx_dma_configure(struct spi_controller *controller) +{ + int ret; + enum dma_slave_buswidth buswidth; + struct dma_slave_config rx =3D {}, tx =3D {}; + struct spi_imx_data *spi_imx =3D spi_controller_get_devdata(controller); + + switch (spi_imx_bytes_per_word(spi_imx->bits_per_word)) { + case 4: + buswidth =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + break; + case 2: + buswidth =3D DMA_SLAVE_BUSWIDTH_2_BYTES; + break; + case 1: + buswidth =3D DMA_SLAVE_BUSWIDTH_1_BYTE; + break; + default: + return -EINVAL; + } + + tx.direction =3D DMA_MEM_TO_DEV; + tx.dst_addr =3D spi_imx->base_phys + MXC_CSPITXDATA; + tx.dst_addr_width =3D buswidth; + tx.dst_maxburst =3D spi_imx->wml; + ret =3D dmaengine_slave_config(controller->dma_tx, &tx); + if (ret) { + dev_err(spi_imx->dev, "TX dma configuration failed with %d\n", ret); + return ret; + } + + rx.direction =3D DMA_DEV_TO_MEM; + rx.src_addr =3D spi_imx->base_phys + MXC_CSPIRXDATA; + rx.src_addr_width =3D buswidth; + rx.src_maxburst =3D spi_imx->wml; + ret =3D dmaengine_slave_config(controller->dma_rx, &rx); + if (ret) { + dev_err(spi_imx->dev, "RX dma configuration failed with %d\n", ret); + return ret; + } + + return 0; +} + static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, struct spi_transfer *transfer) { --=20 2.34.1 From nobody Tue Dec 16 13:27:27 2025 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013035.outbound.protection.outlook.com [40.107.159.35]) (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 41ADF2D7D47; Wed, 3 Dec 2025 09:00:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.35 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752429; cv=fail; b=BEV4xK3WlvnOfwCIk+MoR27OAqT0jGOYOgoWVw21Fnn+4kbl15YO+0xufWkEtsMWT7fPjY/XRxprPOI5LLLJdwt4LxSdFxN27j4WgevUFs0neR7FCx4sOswqCoc9inCK2+gN4pPVFUwCXvUV9wbwrqy5ZlNwUTnYzqnmLB1LXsw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752429; c=relaxed/simple; bh=g5nY8SYJMX6KHE09wP+iuL6IEmMxaX3kwVMCJAqe6mY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=VLhKxnh7U4ERX9WT6xzKiC3OCV9djZSxwVleGdY5ObErO0DoughsSviPeVBYVZn1zjUbfcw4IABGCfbGD60CuKGqwyW1PYAOI4qPLJxPR8aEu4H7HO4kBKQPN6lvBVL0GUtkagYn5/2fKn7Zc+tli+ek21QoieJphL1+6mONZk0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=fCL6HsZp; arc=fail smtp.client-ip=40.107.159.35 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="fCL6HsZp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OEZ9bAq6QxSEXCb9OCoxeGvLiF5fPJuR+OPlXIKO0NuxxDK20s1j3W4yvyJSIULN5yl8AAh9oQaXKm0c5J8r8xgo46ZzHXiKBIhmpD+XTXhlE/uwQICP+6lqcWoViEEmiVzanc6kgt473Tv7rHT1i6xizvAW1r68WopF/VL8oBEGqv3Ymasfi79DBZfLBCmsVKw0Yl8eX5qt4aXghtWvar0rRJXNf1ifT6I1aNraS6i2ymZYupYoVuOn276UDYHPZChKnZuv4+Cg6AQTzlXYtZD5LcYbuK6p6IbEEbr/iTvWm9Z+WfJQs1OQLaQxQ6jH/rF0wUROSnZbMP6podkGQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=3dnI4qh/0aH4OV9bjqxyLDoFu9l9WIC4Cg3Yx8x3/FU=; b=oIDaYxyoATLsnBaOCE5jDY6UUL0TiA/C46+MB6aQNEuRhKcTGpHbuzd/CTFAou1b4TFCzkfwRXF6tBnW2D/56lmmKsZ2EZ/KDrIu05YnCP1r5asHJSsfrEpFO5KQnWaaP21nd3fMpgkENXfJsd/tp+BfnODT7hV4nDo2d2DScRyEOtptVRaez56MS6FEp5epsYo+hQPuwvG015BE7Y0X72bhZoOhlLwa7JCTq/wms3kibXV6weHHicDyJB7AU/D1EHP+d+AmninnLDgDvJFF5ipKyjhrtADpMSouIZZ+ly+sXrm+9qXNvGDCfhYQcCzRTAAl5gBI7Tt7a9yvnW5GCA== 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=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=3dnI4qh/0aH4OV9bjqxyLDoFu9l9WIC4Cg3Yx8x3/FU=; b=fCL6HsZpNicQpcNKdCyn5xAtKuNeJ29bDhRDonfxDsue+x3jQMNav3cijUFV+wcFBVsf1s799QqBe5tB7YLq/Z6tqg81OIp/y8LOKRKX0qVlfQjDeNMUCJcXVeZPgm6nLKnm+cawF4dPHYXbwXArROs/XKx++PJ9y8VxPvUbp+YxF7IQEz1HdF4uPROzw+nBrptRT6A0Sz1usQWpPThULAVRp640krL6m2MBPFzcUEp8LqjBDRax2BNu7wpjHA/WrnD9yoJYi99WCctbhDZjeP7VeFqUrVO3BnufCMeV8aadpvZmv3qkkH99rHKe1D16tmqcF4hQjacGobD8Zz0eyA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by PA4PR04MB7981.eurprd04.prod.outlook.com (2603:10a6:102:c0::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Wed, 3 Dec 2025 09:00:23 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9366.012; Wed, 3 Dec 2025 09:00:23 +0000 From: Carlos Song To: frank.li@nxp.com, mkl@pengutronix.de, broonie@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, kees@kernel.org, gustavoars@kernel.org Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Carlos Song , Frank Li Subject: [PATCH v3 2/6] spi: imx: introduce helper to clear DMA mode logic Date: Wed, 3 Dec 2025 16:59:45 +0800 Message-Id: <20251203085949.2922166-3-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251203085949.2922166-1-carlos.song@nxp.com> References: <20251203085949.2922166-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0P190CA0017.EURP190.PROD.OUTLOOK.COM (2603:10a6:208:190::27) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|PA4PR04MB7981:EE_ X-MS-Office365-Filtering-Correlation-Id: 4f6d0161-26c8-458c-e00c-08de324a6496 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|52116014|7416014|19092799006|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?FsSD4Mei7+WO17cjljjsbSa10HJ8/2byxPFGGZjbx4C5xL5Jt/YMh6o7iagZ?= =?us-ascii?Q?j+uYRT5VlOySF3uXBoiZ07fbOmvfGvHPESVGjgF0qM6lGFNZFwECYF3USSuv?= =?us-ascii?Q?ge/6POPqW9idx1K5jzmSUdBuR12o2Rn3v+cvwoTKPv0TzpKYw0UaJZPuVmU+?= =?us-ascii?Q?bSSt5WyhusZElZ28xYvbqAovlfTk4nApEBT0QGHgE1f1Z1s3MjJRemLaKCKR?= =?us-ascii?Q?fFPPN1ed0Xo76JHkSDubMpdfdWKVQE8JOLfrUdlEsWrbswry0OL1n4IMGlue?= =?us-ascii?Q?H4EvBP/wa5mSg16VLGdwTzaP3ozSydavBRqj32u7WbxqM25T4n9XTUwqBKxw?= =?us-ascii?Q?Hr7h4KSImu4vUNiIs0CgR/32DXPmTRH0mN/p7Nf2IVuQg6KydEqvWImceI/Z?= =?us-ascii?Q?Dj3z/cccijk2/Be9I0V1N0zsVJCRlKxT6Z3WMvPWzyHlHc1Bc1Oq1zdLicO9?= =?us-ascii?Q?PaRzXLfR8E5xbVzs71ATc1X/aJgHpw80UHZn3rdJ0FRNADfYXIPlBEmPSw4H?= =?us-ascii?Q?cARRwcVw6gK2QCllb20rDCtmVCq36fGc7oR/G1fzYbov/ONl+xECll8zf/+e?= =?us-ascii?Q?2xRfGJo6u4TJtw9UGvcwup2mKy/ON6M/pynoXtCYPAWHuSHDlnPpiJiNdryc?= =?us-ascii?Q?+uNJzMKCQylKfW3H+3se+xzS5ehxVsFOT0wA2S00eI610MX+rxc0NDQGOdpZ?= =?us-ascii?Q?hLOZIInIF0v1UCRCyQEsysOVZ9ow9UowitjLmDEi96ujl5KnzM8dSFHlc+9j?= =?us-ascii?Q?j7rYq/pE8Sy9JaEPqkCugWXNXXGAZGEmNcLCEGg9UX1DIJXYR13OzNUDF09b?= =?us-ascii?Q?Ig2SgYscmesBoAlVUjygjDuX5mdbHOR12+4ep+7BKwdIN2QXaYCCqEP0MtYf?= =?us-ascii?Q?1+BjIWuDfwkAWxflStYr2GM0GJ2/OzucREEjoQ0ybpig6WcQpkgXL0Kefl10?= =?us-ascii?Q?63JCX5BtFyrup1Lxu9PePzeF4z0fUC4k1gQV7IPMEGThSKzR3mjDDT+HIALw?= =?us-ascii?Q?UtP9diAneKBwTFBq9i0ZdEhGtpAWWfMz8jJREffbi0zOTaAMLEoJOouCEZig?= =?us-ascii?Q?nUUbDyakwAnkDz6eu2hH1ATgP/qXR2QYndhx58BLRYbAXuKikSGlZhjCah7L?= =?us-ascii?Q?NeacCtAhq0dHFB15WjQTtDmePFuRNIXjFBz189zQusB7ul7QIEZPefwl6b8F?= =?us-ascii?Q?WCxLBbT1sU4TwQ7yt5N9xT5E+K1MeehccIJF0No5XdP/J3KvpZ48NAZ/S1nm?= =?us-ascii?Q?kln2gPEcPso5/1zZ33EBBnNPPgkXC/dPL3F2t7Op/JaIC9+MFEFckkILddkl?= =?us-ascii?Q?yM8OXEuojtzTqM9RKO3yxeTgV/N9ykzQoKjCuqcts1SaYy8TpPFWZXb0MVtj?= =?us-ascii?Q?vaRDaM7aYnyllAJ3jMUdsxFvaDYu7femIJtm3n/jEs+IqbrPl4dsu+4z0OS0?= =?us-ascii?Q?97311ZrYo9xbdqNeodc4+NtrONyBethlOVRVWJV3UXyYIek/p++R4bW/p540?= =?us-ascii?Q?Ir6ZqgKYTfjW9rkhBqNEGbexYnn3DT0GhL3p?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(52116014)(7416014)(19092799006)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?SxKBWdzZ0NrztVRHDkS6AuLI9Mkq7DVuv4KfkF6ul43GwF6jAuZACsOs4UCY?= =?us-ascii?Q?lrU5NXINZ+/9+bnZYruy2QAj9UXDxm9qGgc0IDit8zxEG+Q7aPL90JFciR0d?= =?us-ascii?Q?bIuwCeSFJHpEXJWbq5JMkYDJrYWjjfbc30fOtsQheWf4B2Dq0MSwVVyWK/7r?= =?us-ascii?Q?Tjm701O4dKc99v24O6f+luGFyBTAR7yRNblj0KJ/ZMmpTd/WSBeD+gM0m/qS?= =?us-ascii?Q?uXKVoTeM43VhpRMJcv6cUAAf8pKT/he3MbRNZifQ1gUFCer/7zekOkCDjyeb?= =?us-ascii?Q?SY+UE7WVv7SQ6DKWep6yW1dK9mhyvlsG1J07cyaBKgxyCEYZH6y5++AdHEy3?= =?us-ascii?Q?Ik97pr4OCJTppFwKvTaF/UQ/lZpJvOAuX4f+pWwAsOa3MqtQUOmF9v1Ha8l8?= =?us-ascii?Q?Ov3onU/k+g+3Bf+0TBzQIAIvm6oDGrlaDJ7GKkmzXWYc1V0/2KxeihyXPpgi?= =?us-ascii?Q?ljHxnFVT/FJryczPMsvNRprXIlFJOw8Q9HkQU3otiNfwmsFcy9kdUZiRm9Xt?= =?us-ascii?Q?zwsteu2adk8ZY1T3EXeuUbUfGJ+xTkeAs47bd1Wo5+VBpwENDfCrAIXY0Ptv?= =?us-ascii?Q?4A9fFfB/1HrW8EvH6k98FbUwVTQCrOybHrkcIG7QKobr9WdGBUKCKFRJcaHJ?= =?us-ascii?Q?vrWjFl7/nWzFuBYBefdrYyuhS++/UbG6v4nbYlXomLbvxliTEMfpg31Z8Cbz?= =?us-ascii?Q?4M/b69x2NsmsF1ZmYwKw3vlNgbWuNULHwetC2cb/BQR+1sRQwEdtSXMP+SBc?= =?us-ascii?Q?2OI6pfSSsjIHoIbvrbYTO8kx0zRPepEbOYa3L1tb3p3WFc9qUpCIgUvQ1KOr?= =?us-ascii?Q?P50F+awJIVnVR7qxIiXO6toyPRCa2ISK4hcyZ4yqPDbaj9R/P7WBYOV1JQM0?= =?us-ascii?Q?fTIlUTveI8cDSLp51nb/utKQeDfeQy/lm3SNKu92QE6c8mPa0xJ2MfM6WrxQ?= =?us-ascii?Q?Em5M4BSkREwjO6FcgoM2EFjbgYKpPRYj8jxMCffT1p4ogAHKACQF8mKtZOar?= =?us-ascii?Q?Ski7zN9IqONFa7ooqg58jdkd3ef3SPvC3MAlhXmhcXoCOWeYhVPhCYOHToM6?= =?us-ascii?Q?FGtXYcrkjByO04ZOFjd05Ed4TWPAntBrefd3kRcx5MzX93kxDYBTesyY8wge?= =?us-ascii?Q?xr3W+SUCiSnwwaDzkGxKRinRFGaQya+sPLLx11b587+bP6C4dDdcNZxpREH+?= =?us-ascii?Q?ElTGRtlqhqGZQikVPUFLywY66+to2mfP1ACwW9VR+xKyawqRCXV9SZU5CxJn?= =?us-ascii?Q?vL1uY/M4gYR27s8zaYb51CBKitrL7wJ0N1mHEKxX4be3V48flXj2il2zylEx?= =?us-ascii?Q?Bzglll1JRTSgolsvvkkAWWVGDQOai6ZIERsMeVIIdvm4YQY6HLAA9zaaKOBN?= =?us-ascii?Q?JapjvFZeJ4cleghhZK/meZkssygxzAQZuaCWHBAeO54CHCA7UjWvMrGBCmuB?= =?us-ascii?Q?U1um4hV3BDj7CK5MEP5bcq1eUD4dpaVYy1PrnBU/aoZiLpMKDuEfJi9fVmiL?= =?us-ascii?Q?Nj6vQrYIUjhDQ1M5JIzhtXzCOCH6fHgEHPz12F/+C2/PPaTS2a8+oPCNanw2?= =?us-ascii?Q?XGdmtHOH8J11En+UB550qUxoM/hZAopEeLb8tXPO?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4f6d0161-26c8-458c-e00c-08de324a6496 X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Dec 2025 09:00:23.3883 (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: VCxIA246Zt37z0wdX70uQQzL+qr2YMSUMn0+AQqZf6rQYGVPf0WbTyn8OO4XNFJZ86zB4zspHO4ptB1hVeHorw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR04MB7981 Content-Type: text/plain; charset="utf-8" Add a helper function to handle clearing DMA mode, including getting the maximum watermark length and submitting the DMA request. This refactoring makes the code more concise and improves readability. No functional changes. Signed-off-by: Carlos Song Reviewed-by: Frank Li --- drivers/spi/spi-imx.c | 164 +++++++++++++++++++++++------------------- 1 file changed, 92 insertions(+), 72 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index e78e02a84b50..012f5bcbf73f 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -1437,6 +1437,94 @@ static int spi_imx_calculate_timeout(struct spi_imx_= data *spi_imx, int size) return secs_to_jiffies(2 * timeout); } =20 +static int spi_imx_dma_submit(struct spi_imx_data *spi_imx, + struct spi_transfer *transfer) +{ + struct sg_table *tx =3D &transfer->tx_sg, *rx =3D &transfer->rx_sg; + struct spi_controller *controller =3D spi_imx->controller; + struct dma_async_tx_descriptor *desc_tx, *desc_rx; + unsigned long transfer_timeout; + unsigned long time_left; + + /* + * The TX DMA setup starts the transfer, so make sure RX is configured + * before TX. + */ + desc_rx =3D dmaengine_prep_slave_sg(controller->dma_rx, + rx->sgl, rx->nents, DMA_DEV_TO_MEM, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + if (!desc_rx) { + transfer->error |=3D SPI_TRANS_FAIL_NO_START; + return -EINVAL; + } + + desc_rx->callback =3D spi_imx_dma_rx_callback; + desc_rx->callback_param =3D (void *)spi_imx; + dmaengine_submit(desc_rx); + reinit_completion(&spi_imx->dma_rx_completion); + dma_async_issue_pending(controller->dma_rx); + + desc_tx =3D dmaengine_prep_slave_sg(controller->dma_tx, + tx->sgl, tx->nents, DMA_MEM_TO_DEV, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + if (!desc_tx) { + dmaengine_terminate_all(controller->dma_tx); + dmaengine_terminate_all(controller->dma_rx); + return -EINVAL; + } + + desc_tx->callback =3D spi_imx_dma_tx_callback; + desc_tx->callback_param =3D (void *)spi_imx; + dmaengine_submit(desc_tx); + reinit_completion(&spi_imx->dma_tx_completion); + dma_async_issue_pending(controller->dma_tx); + + spi_imx->devtype_data->trigger(spi_imx); + + transfer_timeout =3D spi_imx_calculate_timeout(spi_imx, transfer->len); + + /* Wait SDMA to finish the data transfer.*/ + time_left =3D wait_for_completion_timeout(&spi_imx->dma_tx_completion, + transfer_timeout); + if (!time_left) { + dev_err(spi_imx->dev, "I/O Error in DMA TX\n"); + dmaengine_terminate_all(controller->dma_tx); + dmaengine_terminate_all(controller->dma_rx); + return -ETIMEDOUT; + } + + time_left =3D wait_for_completion_timeout(&spi_imx->dma_rx_completion, + transfer_timeout); + if (!time_left) { + dev_err(&controller->dev, "I/O Error in DMA RX\n"); + spi_imx->devtype_data->reset(spi_imx); + dmaengine_terminate_all(controller->dma_rx); + return -ETIMEDOUT; + } + + return 0; +} + +static void spi_imx_dma_max_wml_find(struct spi_imx_data *spi_imx, + struct spi_transfer *transfer) +{ + struct sg_table *rx =3D &transfer->rx_sg; + struct scatterlist *last_sg =3D sg_last(rx->sgl, rx->nents); + unsigned int bytes_per_word, i; + + /* Get the right burst length from the last sg to ensure no tail data */ + bytes_per_word =3D spi_imx_bytes_per_word(transfer->bits_per_word); + for (i =3D spi_imx->devtype_data->fifo_size / 2; i > 0; i--) { + if (!(sg_dma_len(last_sg) % (i * bytes_per_word))) + break; + } + /* Use 1 as wml in case no available burst length got */ + if (i =3D=3D 0) + i =3D 1; + + spi_imx->wml =3D i; +} + static int spi_imx_dma_configure(struct spi_controller *controller) { int ret; @@ -1484,26 +1572,10 @@ static int spi_imx_dma_configure(struct spi_control= ler *controller) static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, struct spi_transfer *transfer) { - struct dma_async_tx_descriptor *desc_tx, *desc_rx; - unsigned long transfer_timeout; - unsigned long time_left; struct spi_controller *controller =3D spi_imx->controller; - struct sg_table *tx =3D &transfer->tx_sg, *rx =3D &transfer->rx_sg; - struct scatterlist *last_sg =3D sg_last(rx->sgl, rx->nents); - unsigned int bytes_per_word, i; int ret; =20 - /* Get the right burst length from the last sg to ensure no tail data */ - bytes_per_word =3D spi_imx_bytes_per_word(transfer->bits_per_word); - for (i =3D spi_imx->devtype_data->fifo_size / 2; i > 0; i--) { - if (!(sg_dma_len(last_sg) % (i * bytes_per_word))) - break; - } - /* Use 1 as wml in case no available burst length got */ - if (i =3D=3D 0) - i =3D 1; - - spi_imx->wml =3D i; + spi_imx_dma_max_wml_find(spi_imx, transfer); =20 ret =3D spi_imx_dma_configure(controller); if (ret) @@ -1516,61 +1588,9 @@ static int spi_imx_dma_transfer(struct spi_imx_data = *spi_imx, } spi_imx->devtype_data->setup_wml(spi_imx); =20 - /* - * The TX DMA setup starts the transfer, so make sure RX is configured - * before TX. - */ - desc_rx =3D dmaengine_prep_slave_sg(controller->dma_rx, - rx->sgl, rx->nents, DMA_DEV_TO_MEM, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); - if (!desc_rx) { - ret =3D -EINVAL; - goto dma_failure_no_start; - } - - desc_rx->callback =3D spi_imx_dma_rx_callback; - desc_rx->callback_param =3D (void *)spi_imx; - dmaengine_submit(desc_rx); - reinit_completion(&spi_imx->dma_rx_completion); - dma_async_issue_pending(controller->dma_rx); - - desc_tx =3D dmaengine_prep_slave_sg(controller->dma_tx, - tx->sgl, tx->nents, DMA_MEM_TO_DEV, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); - if (!desc_tx) { - dmaengine_terminate_all(controller->dma_tx); - dmaengine_terminate_all(controller->dma_rx); - return -EINVAL; - } - - desc_tx->callback =3D spi_imx_dma_tx_callback; - desc_tx->callback_param =3D (void *)spi_imx; - dmaengine_submit(desc_tx); - reinit_completion(&spi_imx->dma_tx_completion); - dma_async_issue_pending(controller->dma_tx); - - spi_imx->devtype_data->trigger(spi_imx); - - transfer_timeout =3D spi_imx_calculate_timeout(spi_imx, transfer->len); - - /* Wait SDMA to finish the data transfer.*/ - time_left =3D wait_for_completion_timeout(&spi_imx->dma_tx_completion, - transfer_timeout); - if (!time_left) { - dev_err(spi_imx->dev, "I/O Error in DMA TX\n"); - dmaengine_terminate_all(controller->dma_tx); - dmaengine_terminate_all(controller->dma_rx); - return -ETIMEDOUT; - } - - time_left =3D wait_for_completion_timeout(&spi_imx->dma_rx_completion, - transfer_timeout); - if (!time_left) { - dev_err(&controller->dev, "I/O Error in DMA RX\n"); - spi_imx->devtype_data->reset(spi_imx); - dmaengine_terminate_all(controller->dma_rx); - return -ETIMEDOUT; - } + ret =3D spi_imx_dma_submit(spi_imx, transfer); + if (ret) + return ret; =20 return 0; /* fallback to pio */ --=20 2.34.1 From nobody Tue Dec 16 13:27:27 2025 Received: from DUZPR83CU001.outbound.protection.outlook.com (mail-northeuropeazon11012017.outbound.protection.outlook.com [52.101.66.17]) (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 F2D412D6E49; Wed, 3 Dec 2025 09:00:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.66.17 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752434; cv=fail; b=Tqv/7BMIYAQLoi9QvT2hPN1Bl1C1OnHnnxBIykZy4PApvWe0P1c8r2u8Loek8xo+VxYF/eKriRzC4mbkc2Qz53N5b4z855fc2xgRFpEUfQyof28pZ20G2qIB2UpUzUx7SVnR7gEOFprT97FlEPDWCoFi7qG3asGftNbKep1D98U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752434; c=relaxed/simple; bh=tHPSUI70wtJTRDAlO92OiqkMJqUD841QqoTgE0vlMl4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=mZFUgOZArIHEDnRMcZ5QkmGnvEk2rdHwTGcU+ylwithiXjmm4ucctDLbcQo+UGqaeYW5b7Pq4LX7hmk2HPAdsgtSPzwwo1l7/gPyF6VL8BxQhLV3VAZjlFAbZNbxR46e0ddYEVgY/7WUYEZ9fiPAv3qtutoTRNTSE0JFCFHaSUw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=Tf81t/MO; arc=fail smtp.client-ip=52.101.66.17 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="Tf81t/MO" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wuS4L2nhqCWpHfGFxBNsS8NR5+a6fHPOhu3beb36NcEcn3IEQiohRjEzPmO278vH3eG3Du7EOuVbR1+8Kcd4cSpET35ris24VmnYM5CUKwZolBzct6UwWG8yfPt8sSehTiWdfIOO0+AegNFBuGeC+n5Po6+ubDVBVqAtx66XLJygTedcwl4BzN0D3sFhZoaHAgKT2evVonfJ7I64zMcqfuurD3tSkr5LVRp7rz8p8q0cU5bL2aX2tfTjW5jSNFyfN74R6P+42eFMZqhhhu3TL7ezex0MHG1Db0goVstARqvl+18WWEUAbt0gq3fyyidiRpWOkgyL1U80Pc3gdiz+Dg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=AsjHYHNLwrkWNxGNsJ2qgEZe4Qdgqq+BoLSOrD9LpHU=; b=mN/MIx+LCt0L4Bh+5lGbG37KzmHz4z8QKjpd+VnwLxsDr7XQp8nbZA9i1cQj3ufiQ4tZ3qROdoUfWO0K9waLS/xgox31xif29zrEhE5ByDBOAcBtvdY3m/0dyt94dIGi9CCzDWER5a9XC1jJ+3GPXuHhWYZB1nfyUdBK1LMJfU5+SYwbaDNj6j+KHTmFLNxeCD9HAL547ElToMzuqkt2UrD+BqiW1TcG2SAKJNb43s6HbvPtPo/8mfNqom9VJKSDQdBa8oxvsUcll8Mj4B5zRQzvQPTbWNxK/bHC2DynEBwrJqjjzc6g0RbrjgNe658A1TyXCmEY1ZPlhlkA/wdvUA== 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=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AsjHYHNLwrkWNxGNsJ2qgEZe4Qdgqq+BoLSOrD9LpHU=; b=Tf81t/MOGIiOUZtJ1Le0AGFMV8EJvs4VjzfV9UTxnpKiE6kU3n1Du+PlmWrJpe/3Xa+jd01rn074xGk94GTVzYeUOghxaYp/oowIvuu56o8gEzHf9fBsezdEYCDvFTlyvh1f6JtZtb5VsjTXlaMOv0z2ZuVZoO8vXoHJ9FZVXGJSOpvwK0uJy88oo/I+8KXfuswQ/CHU5DszqqnV4JDYX5EicF+met9bngze0PgOld9JSD5W34ggs8wLSLJz1N+sZ9iSm6k9465OyF39G3hpaVPQCvdhYWqRLfVKRASXQDF5yvNjh24D/mBN9OOsv615wGsDVHFGIPKCsL318wSehQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by AM0PR04MB6868.eurprd04.prod.outlook.com (2603:10a6:208:18c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Wed, 3 Dec 2025 09:00:30 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9366.012; Wed, 3 Dec 2025 09:00:30 +0000 From: Carlos Song To: frank.li@nxp.com, mkl@pengutronix.de, broonie@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, kees@kernel.org, gustavoars@kernel.org Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Carlos Song , Frank Li Subject: [PATCH v3 3/6] spi: imx: avoid dmaengine_terminate_all() on TX prep failure Date: Wed, 3 Dec 2025 16:59:46 +0800 Message-Id: <20251203085949.2922166-4-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251203085949.2922166-1-carlos.song@nxp.com> References: <20251203085949.2922166-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0P190CA0017.EURP190.PROD.OUTLOOK.COM (2603:10a6:208:190::27) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|AM0PR04MB6868:EE_ X-MS-Office365-Filtering-Correlation-Id: e6ac0ea2-a8cb-4141-3b6d-08de324a686b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|19092799006|366016|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?5pD/03z6XvA8nMlEKp/HU1fhuwuNoTcW2g8sBpHjeeCPbmTYAMTKmlvCrEN+?= =?us-ascii?Q?KR0PKDl0xqFLwIPp9SFwIJajP7PlZxKcwOyn9kuzs1uXaPkHx/pR1XzdD0JK?= =?us-ascii?Q?SUCHW30LSZ9jTae+Mcm7K008OPKnaPIHabPFMND4x68DfEP+5SXuT2E5RT5n?= =?us-ascii?Q?xQ1itxX33+2dm4LwLW+vZEp5LNYDO7PstS2r8kg41YBegefb4KLrf2zkoMyA?= =?us-ascii?Q?nNYCLjm+m0T2CBAOpq1uazcadULv1mfaxUk1gQ2iyXSbp0qOKD5nvqtmXwy9?= =?us-ascii?Q?CbZlYfspJyz5WHwpRz/MK/K1dRTMRVxawTLXhDrXAv/da5jJxQYtEGBKgdNf?= =?us-ascii?Q?oMXYb0sZyfxCFZpxm9hvXKVRSCkkmmxLNfizEsZzSk5btcPhC7RIEqxmVjAX?= =?us-ascii?Q?7tRtxAaHs4t/cgaouAibpirxjwhTZBNbTi1k3rBmac1FpW5DsrnkobZiKxpF?= =?us-ascii?Q?vyvVggu7ApVomJug68EUTqF/tFEG4Nyxx2mXPn70w6ltI2r+djkh3Sn9rXgM?= =?us-ascii?Q?dlmKuBEvDr4aTsERHPa7zywG+bv24WfApLdwyepnp704kipoHXjTDCdqjspZ?= =?us-ascii?Q?8H2VNDOPnpNZ2G64NPRmGNz4dPP1WtAA86b/CLTiQwZU3jrlCBplOenpEO5T?= =?us-ascii?Q?ALPguK6zx+qPRFtC027i7WmLtD+PEfD3C+hCzDgUqS8vdydyeLALmUUEC8AR?= =?us-ascii?Q?MkXi2aMAsdtNFqcWxLvGFiNpCcylGHOcsJXgj4CSwjoezmJ77wAx1JKpDCMT?= =?us-ascii?Q?0XFfuxAVJ1QiFhP3Pbn0RbapP34siZUffJGtgqjSVFRj6doHTpkaXELLItuP?= =?us-ascii?Q?VD9l/ys/CTM8Mfw9LOK81/g/yzYzNfRaMcUJOi6l75nn4SLUPvXvSE3C6CQ4?= =?us-ascii?Q?r0/FcM1uacUEfqo3GFF0n3Vubacga7Qvi41ulqCdBBnxEF2F7sNoWUzgwV5T?= =?us-ascii?Q?vUEMxuAD8O5MQPKSusLxBb7AKeoQbjB+d/K+AXuwc6T5CHVRjmETbWMwGnhc?= =?us-ascii?Q?+JmH4bsUehg3e6GZIYzLYlvqbV5wx3FbPjS0yV3fQ41nrr257nnZmhJIu+0M?= =?us-ascii?Q?aEwp0aO9C08XIYghdadP3SZzWw8O8xjeb/AJy4lvp14i+Ftdb8JZ0uMV8D/8?= =?us-ascii?Q?YgeXjnb1NhqxbyI5+dicKtoyJQNaEsNPACq7O6elJQN4KxL8OpGaKw+J2gAO?= =?us-ascii?Q?Qm0iMGbd9Q4GvEOUwdYtY2grGHQVZrINuYaIzBnrn3wXMjnb9uquH776A/0z?= =?us-ascii?Q?XMEXHsNHwCcF6eeeGedt+36fUnbS4vD6+k9Org7GBhh2Yn5TIlQ83xz/Qhq9?= =?us-ascii?Q?YW8Owlx8C3lml6sweeCc3Nl2f7PQvPKQLS95l5/u5BUrkvcsSUdjBkNi+Wyy?= =?us-ascii?Q?F63y37sECU5zf+8kw4GXX9CzV6FH6Rfboq6t1WRq7ruyuoLEAa+M5fduwHdp?= =?us-ascii?Q?GcG/wvNf0gzpZTvHh03Y+FCeDdGjI6dk+yCLWbG4zrFWHtBox97eBodp8ikE?= =?us-ascii?Q?M7Khijy/7t2+HxAhPtWUHANWxtM85JCc2mf/?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(19092799006)(366016)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?mkNhxstFQyfvmUqop2QrHlxeKXH2Shn8u6Fa4hzoMc8sqIFhu/hY5fQEhRxv?= =?us-ascii?Q?BPZ8vVHzyvvduS6dYoE3y6p5XfLKmHAUejBfOROuBMEWntKSNmgKZELH+Lji?= =?us-ascii?Q?ZXuRyYPewia6wuxtp8MPPoGdQCq6kxNG6fi3h+SYGs/QHvoRD6GsC7LVi2DZ?= =?us-ascii?Q?J3GD28203xMLp8mzFtqQRQczZRzXpJTLhDtvGUcourhQi7LNbIqWlrLPYVSM?= =?us-ascii?Q?f9cV1OMs/DT3XlPDMtY9UoUEzIjRFu9DMzPMxR66D8AaiDwciCoQ1YdR9rvN?= =?us-ascii?Q?DWeNYASaJH1g8FXWUdvrSJypmr1UvUNoAlqX0+C9VccY6tePFkmTXV/ul9Ch?= =?us-ascii?Q?lVxWISDY67PBhSRy/MkYgxMJkfmImdMu93DZ3v5XbhSZ9ZuPtAZuI+6vkEYi?= =?us-ascii?Q?qF0L1+Dp+sG6dtQLlTq3NFMNQD2wEp7smZRHRcOxdlnjDDhehFffQWyjxdfr?= =?us-ascii?Q?Ts5/iQfdaa323yHj+oiFM1zvYAECYboeoj39pd7Cm6bajVLmQ2BNUTKbkw1K?= =?us-ascii?Q?B5e7ITQIocx8bx9+BAwwQV+nNCLw/e0cev1LzxZCLs3UiZSQanAb05cqJPiJ?= =?us-ascii?Q?07N8CNqcKPOsv+H0389ZntXdv1v3eA4YT3plChYF2rK87XSPCMhL4oMjzujr?= =?us-ascii?Q?3TbnijjyPFRVethzV03sRIIwu+kb5fmqKRRW5C7L008MhQbOO57zZx/MTLk1?= =?us-ascii?Q?nwa/okYDRCiRDm6K68SPkHnvmsrVuRMDvuG45gDbYeFtc9L62S4zXahmyAzU?= =?us-ascii?Q?KT+g2d8tbUkQXNqQKjTE4TlKGhjI7AuW4MlgfGaPFTfk7cIOsjFJfL6SuP2J?= =?us-ascii?Q?VYZJNdRmPNeNAiWDlLvNk5Z09t/1UWwnLmFT8WuPY6tnyCSKjdyl3D467Ph3?= =?us-ascii?Q?GbW7tmuTmpUMCanzBN7ma1sSu1tWojy8ywfQl6K6MF8GSWRS49YGaXkaywJs?= =?us-ascii?Q?V5Qf5UAdtwApT8GAphQkJFBAeUhnVxQL5bnD8Dwj43JeFFRn/2VMLR6HYnpW?= =?us-ascii?Q?hcafRMc2I3VloJFUAHnSnU+t3LeFdbQrwSMfBTZUFmYSCOyPU5RJ6WkcNapk?= =?us-ascii?Q?Y0fpW8I5B3byKjawpa13H6kGJzOCDt0jGQgxMSqmCvhKCEjPkBf1XrfNDeks?= =?us-ascii?Q?XjUid9o3ydxXhXr2IYTJzKKZD2HW0U6N3XM5qA+3YNDuy0nZGW7v5rl0MPDq?= =?us-ascii?Q?xAxPfyzcpS1J4sTqvuAlwUukgryzYdrDOYgbdB6aCNjFFrF5RaI+g+flZbF1?= =?us-ascii?Q?TyKPc/NT2SBVVTGP8cSMGeaQ5tsQHCjJdlCo0KBdpk7r5LQtBl1hVy0eAia5?= =?us-ascii?Q?00/GA2HN85+5a3hWBW1N6sWl8zqKgPScWKV7mDKHxBPknChS0ksAGKt+tAbI?= =?us-ascii?Q?4gQ0GSKchO3umLTb6psm+QNKhFvFlD9ZtlOTSSg9rtIntBr+C/ioX4RL8XhF?= =?us-ascii?Q?OHwNq5pUK56+UhaM1ik+BIV8T1MNEGNL4WPD4ogENwAVwzfQo0BTAoLyEFuH?= =?us-ascii?Q?sbWNtHfxkS1S1npND3M8g4mb/IlOyGm0MlXIDYg7OC8uy0EhVAWO/lo4ozkk?= =?us-ascii?Q?WxvQzpqLkvejMDFNi/bqcbKOh6tXKNDo514oM4UN?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: e6ac0ea2-a8cb-4141-3b6d-08de324a686b X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Dec 2025 09:00:30.2441 (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: VzyTvFYNdy5mfMQXdXUxcf4PnIuSE4GfhhKP5msAalmV5WmhS6Eaj7rf7yo5WNZYql0qhLdK1W+dm1BZ70EF/w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB6868 Content-Type: text/plain; charset="utf-8" If dmaengine_prep_slave_sg() fails, no descriptor is submitted to the TX channel and DMA is never started. Therefore, calling dmaengine_terminate_all() for the TX DMA channel is unnecessary. Signed-off-by: Carlos Song Reviewed-by: Frank Li --- drivers/spi/spi-imx.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 012f5bcbf73f..186963d3d2e0 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -1468,7 +1468,6 @@ static int spi_imx_dma_submit(struct spi_imx_data *sp= i_imx, tx->sgl, tx->nents, DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!desc_tx) { - dmaengine_terminate_all(controller->dma_tx); dmaengine_terminate_all(controller->dma_rx); return -EINVAL; } --=20 2.34.1 From nobody Tue Dec 16 13:27:27 2025 Received: from AS8PR04CU009.outbound.protection.outlook.com (mail-westeuropeazon11011029.outbound.protection.outlook.com [52.101.70.29]) (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 4F84D218AD4; Wed, 3 Dec 2025 09:00:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.70.29 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752442; cv=fail; b=Y/2jGueQN7NzXswRCvt8xY3IV4FWJcWKSzR5XZIrQGHmvN7abdJoW8cEsVIXtanrqcrxnu2WjfyH5lBVdTCfJ/+WBG+JlDO5+QRw4R5FVmXcCiXuojxrEn6dd7OZCrCX8v6Ums4xpzcs+JyqnywYqRq6GCATzLcRgP7uZPLLTw8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752442; c=relaxed/simple; bh=H25pw5D5zL6skjChnyxfweuc79CQ/ylSxbjW+YJVPF4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=Ur7IrvbteuISofLrMLjVNFFsVCP/9FtVl3OE8H5dJpLMiR+JIbaLsTTpfdegG3nVEwOZgwfbmoSOidTPvYTT5k8/VX/MMBAxUp9+2OTmYpk56LphprS8kmrqTrr7o6zjghgueIO4dTRrhTQoc7aHYRE/0pRQ6hh67z5rm2dCop0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=cWaW8Pcy; arc=fail smtp.client-ip=52.101.70.29 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="cWaW8Pcy" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=f24PbhGq0Z0yGTTx+Sd7dw9ZFMqVSI/1ryWw4auJcjdO46zoaY1L3Ohi+M/l1A88wSmjKa2BNNv5sqA+CC+98d3MRYwdgjXj50qLn7j/BqIQIznMvl1yPDh+0QWZt1LTS1PXwOo2b0YGmjpwO7mMcPU00wO4sH89kufO+9/dIV4Cu22mwx7fZBOvzJQiHjJCm/SDkXWy8Vl6KB9mY4+WEN2q4HwKnvcqW9ocGtu2JDwtNphjcqA/7o1Zle02+KXJ5GxTHf1tKBf9DT4X3EsXctcUR6M7EzjCAopYJ+eRpP+jcER1YyaaaB5af3cSQpCOWGacU8G9dBmdWpzHWDe5bQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=9sPjGfJ4KUeawhjCFNtgrNytcqNmzSFeWPen5MoTn6Y=; b=p2NdMky+ZcWUT561tWZM6ZpCBjCC4jWc+qL//bbL1unjCGbexPvFiFEce5hUXF+XlSQXJnAYrAgklv9Gn16ExchNzYU/4xbfRUPk4z44ZN3+Sao3DmhC1uClYRhNSCfAAh/Heiez36lXuWdC+o9k6IFUi0UvbLO7oLMlSdvx9MJ+iKSXnTzcR+TopPQHIMg/Nz6ezpE45ROtPy5NZRPhFNXC5qPideoPMVqoVeLVpvOzvrdpwp7ZBXvb8WQCUZkxVahm1VusAyP/CqM+ckYicqGI+H1qWGqSrBBxaBLFt3rRQZFh104Fw3NF2B8PxAZ54zY+g9gv/9c+TQfidjRf8Q== 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=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9sPjGfJ4KUeawhjCFNtgrNytcqNmzSFeWPen5MoTn6Y=; b=cWaW8PcyAss5MnlaquAFcBaj9XDFxWF39b5uUjbKmJclparXCZVfJc0txYBlJ3/PzeGvKvtLK5byjbQjsMqqy8OsyCijo6q3oext+uZrDB2iit4/Txp8MhgN8ddrNfra+DkY0J06nKc33N5n+Fymk5g7a0IPd0IGiLmr4Gnm4Pk2DMmA2kOFx+goNlOB7lm9lqJrC+fOq0mLiRh0k8DE/+b0KZo1+9RgV/hnN7FSvdZSd1uBCrXI0IbkBKQztAtJviTrdNge58s7Wti2Rv3v0eS0+eoaIizE9GZLeIJYQxq4B6z4ul0kkBhAABpSvrogR00ggudzY8zCd/6p+I7Z5Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by PA4PR04MB7981.eurprd04.prod.outlook.com (2603:10a6:102:c0::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Wed, 3 Dec 2025 09:00:37 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9366.012; Wed, 3 Dec 2025 09:00:37 +0000 From: Carlos Song To: frank.li@nxp.com, mkl@pengutronix.de, broonie@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, kees@kernel.org, gustavoars@kernel.org Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Carlos Song , Frank Li Subject: [PATCH v3 4/6] spi: imx: handle DMA submission errors with dma_submit_error() Date: Wed, 3 Dec 2025 16:59:47 +0800 Message-Id: <20251203085949.2922166-5-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251203085949.2922166-1-carlos.song@nxp.com> References: <20251203085949.2922166-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0P190CA0017.EURP190.PROD.OUTLOOK.COM (2603:10a6:208:190::27) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|PA4PR04MB7981:EE_ X-MS-Office365-Filtering-Correlation-Id: 2d6fb37b-83d3-42c9-a9cb-08de324a6d11 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|52116014|7416014|19092799006|1800799024|366016|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?oaSytfZjEKOjeSeATW/Ym/oso2reIL9l09fRVhRstqSxaHvyf2KJl1loAAtb?= =?us-ascii?Q?2POHs+vPH3/V2mLLD4brAnGI/AoiaUAoKxaL6J7lb7HpQENuuWpyjW7tbPmy?= =?us-ascii?Q?JtFiPk1tyJNyx24FIYKo4U1Upn+yZFSqjB4CYrJTorrtWfI27Qy2MWsenLd+?= =?us-ascii?Q?fMbotXZAjukOxnXlZNcrSLwFdDcd3yYfmJ5L+qpxoAfgyEOSLQJoNINbrMZv?= =?us-ascii?Q?LcDQuySqXW+7o0FAaXSu0Y1PqJw5H7L4l1FFkvZOrwWZQakUV4Z+FtLFuBJA?= =?us-ascii?Q?gow8PYzhNxKo/WDovoJdQns5ZzM3Sn9lGTmsyauTt0qqf8XhNGSylRQ+ygHr?= =?us-ascii?Q?4vVJjEQzAtKKV5SMEyB8Dfq82pSIc/7iQ4R5W10SQLW4qLkL11ugAOO+5hJK?= =?us-ascii?Q?uRmI9KPJBDUuK5BncZ3PCSeqxigbZwXI1q/B/AjO6i6HOStrDmm9v75ZdHF0?= =?us-ascii?Q?UrDdnmIh7BX26PYz9h1ZQKC5GyMGixlWi7ngq40vE0PXJRqRMBk88G7C8+eu?= =?us-ascii?Q?AspYHofViS3WzZTngAf37d4bqXJXDv+WqeK88H8FiX4qLfjVMA0SAp1GCNq5?= =?us-ascii?Q?/3nQTaPm59ehR9ru+60/1BCneKiqOT8zlNNy9FqAjcySEWeQgnKWIenYKGDI?= =?us-ascii?Q?mphK/wn7ASP/lRDUFHaUj9TXueg8g5Rj1nDBYGVturHLr0YtWufp7Ktg3967?= =?us-ascii?Q?zuZOwxWW7ViBj1YUwA0q4TZkz8OHLot9Ltt9LkXPJyU4i65mmyssOKMIEM8N?= =?us-ascii?Q?Bt3lLlFYe2I1DwHyuh7L/63O1rXWE5YLM4YKvBIT3QblNjvtJ3p8AXRA8i+0?= =?us-ascii?Q?FdWAD/kvNXQkWETzN7hjqo00lfxCP4YVFM1K7JI9amHfRjzHhJ6MC6j3Z52j?= =?us-ascii?Q?4HBVJvGDpSceABWRA2qjviyde76enr8qnm4o+mRLjxwhDGu4+PRS1ycC7sAs?= =?us-ascii?Q?Pi7dw6BrwF/tFK1InJJubwCgGc7By9Pzs0Fx5uv144kVW3MoHoFiftIfTVWI?= =?us-ascii?Q?RS5TfLDBeY7Az0MdcHfC0aelbkdvQ+dFzSxy+Cbg9NUYRG1GEiPqOw85TYFW?= =?us-ascii?Q?iHNYq8gnL/hokFXr96LB24pbEZfRgCtvOtxROIfESYOlXUavbiRn6F/XyPia?= =?us-ascii?Q?Owy9t6bcmDRRUpGY/+G5gMR764Rkg9yE7qh/UbCCXJ1CVDIruEiaFIsmSMfz?= =?us-ascii?Q?aDM+D+yvVRkhjYxKk3A4h+0OLWglwt9OJQe4JBXSvAUSNC+vRT0FMUSwz37f?= =?us-ascii?Q?WAAYkIPeuXh31e92zt9v3MFkOlZFnURNQ+1YJ+hZR15YXLdXzvTVfAuY5Asw?= =?us-ascii?Q?eQypWwMyVhI8cciqPD5k6LNY202GYi7T6OwdekpX4j4ibozPVC+F7Z6RIS7W?= =?us-ascii?Q?VdKdp33kT4fTHwFImzHf93zkXohfpQNP0y5gDZHN074hnbYfLTuon+/VpYrC?= =?us-ascii?Q?A49+ka58R4RTcZIKTSGHBqXtgqz/rQdgTIWW4rV86bUzJfpUY98Qnja436Xy?= =?us-ascii?Q?QqNVCfDrGN4wbUpyFtdDIipT2/3X7ncFfLiz?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(52116014)(7416014)(19092799006)(1800799024)(366016)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?wX9IwYutaZQoYwVvGtufp9D8emRqRJiaYvI/LTNjbzn4ZyAlnVmCe6EwDW2v?= =?us-ascii?Q?Kw746ByQsdYEhJs32up1IAp5+MoyVewonZd7RofiYVEnmQUKnV60Jfl8fLHd?= =?us-ascii?Q?eQCbiHRDNOkDjyz16A1ilVduSAno9SCfrpJ+uh/D2A5DTQsDne8ViKMYrxvb?= =?us-ascii?Q?vcukOkA8TqTbhqOZb8Ic3iSnrTaZIikV2VVmYXFMXY6NP1UqFQ8qd21wRQSP?= =?us-ascii?Q?M+Nfmv1tIoxQMSwlqa8iMphQZ/C46GhWRzdFSM9g6a8x8Da1J0uXHHI2j9UH?= =?us-ascii?Q?CygdL06YVZ9E9bgYmDRX8Qp3EKmzErbTH/riX+C3bI2HTzu9pKn0TTm4s0e4?= =?us-ascii?Q?yzOkmr0D0tQcG9l5/RYNNSXrAW0G48p6vThls+j2k29viY8fGCZvM5oTYYnv?= =?us-ascii?Q?9/aOY3gkQKjPXHXbI7B5tIleLBihWMrCiIXdPHGL7KQ3EcoLjJmj7eMVWYLh?= =?us-ascii?Q?G+JodAp3Bi6GXZOlJI0bB6lD4oGm9MbuAxgPENyZ5IgHQBaTF4tF/x5p7nnm?= =?us-ascii?Q?03+Ei4/QHaVnikxJSFCS/lZvAHMdCHfh3TKKuyUUJ+0M76AXzVuzjSJz1z8R?= =?us-ascii?Q?3Go6CKaSWhLLJum8FdQfAi798G4P5hcy5n5UizHGb85U8eLqV9NEFkczErak?= =?us-ascii?Q?RQr+dxnvtaZb0SIgyrhvkOVDbjoYRXxHQXXADuDKei9PjXseXKxUyyXcsbSu?= =?us-ascii?Q?LEXOl+RzKm5M4b2p7FxonxA6lVu3z3p4MkMVNFLejCULTjWIJPcktfR8L8yd?= =?us-ascii?Q?u8bW6KgNpscNrCubBXduLKX22yxlcwAid0OISDtTze4eAPfYiYJMz5szPT7Y?= =?us-ascii?Q?1iTy+ZHwoOlw4AZlhMABYqGR7HIh+IEeKRJLg2oLR3fETaGF5mV/LzjRag3p?= =?us-ascii?Q?asJlDx5GW6kbpS2MUOqEthkTy4gIsqilDYQRF6NRGQS+ZG6GfxUIMq6DjapA?= =?us-ascii?Q?/dGtXnGy3lLyw4Y7Uvi5xrjWpEZi/qpqYCDD76PD131m++ep2bM8a4T8WDhq?= =?us-ascii?Q?JwVdtgSkpJN97aOktlCxUbHClRbzdPEPMOcyZjmeBSCLyTPZ2IemQzRBvRyy?= =?us-ascii?Q?bsfQSQkVoQxNoea7cqD4Fs08cYJ/CWuMkBOwcCA+sHL3wWaC1nrms+tiCfB/?= =?us-ascii?Q?jx3/maZWRunf+DPEvWzgROBic5jfwj2yjyg7MqWHxgPXMcg+Sh+iBVWt6xYj?= =?us-ascii?Q?eaEvHfHUBLqWus9/hqlzpxXbpWNeXJoK4GMeJLeToimkcDobPQOBZ+l0437x?= =?us-ascii?Q?RImjebxS/LwaiVNJuq4nOj8ku1Js27n1DlDYdDtawe0IhofH8H8XR6HHXaTp?= =?us-ascii?Q?3YAYGyqG8+MAfutXkWqOCiKlarLuCb5GJziiqzmOlEGWwzv+d1WXTJEHfR+M?= =?us-ascii?Q?nWIkLQrdGubW6uKqLl7pn1zdJ2e0U2WpGqbhTtY8zZel9dYdW+mZ1a+90mo8?= =?us-ascii?Q?vsB0rtVn3p+1qPTabE/itVqJWs8aywPNpfzM8tUALbTCt2gU4AuurodncQ3i?= =?us-ascii?Q?m6aYFn7IFxT9JEj4pHqPGexFfDN6MDKr/2SIemwJTgSK+wcxaVDAzT8GPJZE?= =?us-ascii?Q?P6aFDHoHwuHMYe1w70u0n3++MSGCHJivxx4KMXbo?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2d6fb37b-83d3-42c9-a9cb-08de324a6d11 X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Dec 2025 09:00:37.6030 (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: rhqji4Tlca4d9jyx0Nasp9s/yKCRkXK45XdQWMBuf+A4iLYC3vTcLipHLZZc5zhJtU7WkyYgOXPtzD3Aj79bDQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PA4PR04MB7981 Content-Type: text/plain; charset="utf-8" Add error handling for DMA request submission by checking the return cookie with dma_submit_error(). This prevents propagating submission failures through the DMA transfer process, which could lead to unexpected behavior. Signed-off-by: Carlos Song Reviewed-by: Frank Li --- drivers/spi/spi-imx.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 186963d3d2e0..42f64d9535c9 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -1445,6 +1445,7 @@ static int spi_imx_dma_submit(struct spi_imx_data *sp= i_imx, struct dma_async_tx_descriptor *desc_tx, *desc_rx; unsigned long transfer_timeout; unsigned long time_left; + dma_cookie_t cookie; =20 /* * The TX DMA setup starts the transfer, so make sure RX is configured @@ -1460,21 +1461,29 @@ static int spi_imx_dma_submit(struct spi_imx_data *= spi_imx, =20 desc_rx->callback =3D spi_imx_dma_rx_callback; desc_rx->callback_param =3D (void *)spi_imx; - dmaengine_submit(desc_rx); + cookie =3D dmaengine_submit(desc_rx); + if (dma_submit_error(cookie)) { + dev_err(spi_imx->dev, "submitting DMA RX failed\n"); + transfer->error |=3D SPI_TRANS_FAIL_NO_START; + goto dmaengine_terminate_rx; + } + reinit_completion(&spi_imx->dma_rx_completion); dma_async_issue_pending(controller->dma_rx); =20 desc_tx =3D dmaengine_prep_slave_sg(controller->dma_tx, tx->sgl, tx->nents, DMA_MEM_TO_DEV, DMA_PREP_INTERRUPT | DMA_CTRL_ACK); - if (!desc_tx) { - dmaengine_terminate_all(controller->dma_rx); - return -EINVAL; - } + if (!desc_tx) + goto dmaengine_terminate_rx; =20 desc_tx->callback =3D spi_imx_dma_tx_callback; desc_tx->callback_param =3D (void *)spi_imx; - dmaengine_submit(desc_tx); + cookie =3D dmaengine_submit(desc_tx); + if (dma_submit_error(cookie)) { + dev_err(spi_imx->dev, "submitting DMA TX failed\n"); + goto dmaengine_terminate_tx; + } reinit_completion(&spi_imx->dma_tx_completion); dma_async_issue_pending(controller->dma_tx); =20 @@ -1502,6 +1511,13 @@ static int spi_imx_dma_submit(struct spi_imx_data *s= pi_imx, } =20 return 0; + +dmaengine_terminate_tx: + dmaengine_terminate_all(controller->dma_tx); +dmaengine_terminate_rx: + dmaengine_terminate_all(controller->dma_rx); + + return -EINVAL; } =20 static void spi_imx_dma_max_wml_find(struct spi_imx_data *spi_imx, --=20 2.34.1 From nobody Tue Dec 16 13:27:27 2025 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013069.outbound.protection.outlook.com [40.107.159.69]) (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 3CE972D6E70; Wed, 3 Dec 2025 09:00:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.69 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752450; cv=fail; b=b8SZ0WgsSKNnx8nJWfdTobrNPBX3XkonokMVwG2tzS3Gkci3l5bZp/a2c5bmwxgbdRPG49c8Ab84pydYkz+3SYUbaUjzuqzoAtHJsD5k95UEb+odkB5uji7boGTz/ZY4YwuQJIl4ob1PfewvFciIzDX+06bMzLoUiYRHfPY0D8g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752450; c=relaxed/simple; bh=EborCir4qam+eEPdlgjnryTrttyY6rs698YXrBjWPhI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=Q2gdmv+iSkGLe69DLFyCCOoJJDr2ykyVoEviqZ6NjeWbdqS/R1DKx+eWfbzPRUtpaYgapzY4IKVpC1XWdfIYHPAEk6VEDe//FxbExQwgyVJ3XC0sGj8F6IBrCbozQAciAmQNIJYXYIcOW2Qu+6EBQOht8f9U8ntibnid0NQGC+s= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=d3IwLcUa; arc=fail smtp.client-ip=40.107.159.69 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="d3IwLcUa" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=KsRHCKVwDs5RWJTskc01hPZNOm5rtQ43BT/gCyUJo8hxmzuTesU54DDGufV/3FZ/waErSZeGhyvEsU0uXNZT2Ag3ZLi+ILerwlZBrlynSHw4nCLPOZSuvO/8Kv824pZbUAaY3w9kk8hVzRl4NnmJ/vJmKX/B5pmXI24iuKvJFFTTZISppBvjfMQNu03oR8IumnBUCJOwmXAhs9054T+Y8gEGDEQOCAClBHhmlXgt5wMeMfwEqrGF8w4UntrvsHndedn4Z7kQIq04k8XnP3vYWD5yuDIx3OZ7q4UNORMJGaQK+x5OHTQfFHrEbDOBRJuy+ly1NL6Ptdr0kuoovNDTLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=QVkeB7iAyOpsyZzok3gHzZf6pNc/u9xhlnAI6NFRhJU=; b=copRFGO8ADtFKsmqxktusDIv8rHcs0z4GB+eK6dyKu8Vrlxgk89c6D5Cf+tFjsnDRj4qd2KY/36mIx6Q6Uv+7mirMDTWbjKg45lGDZExvex4vZZ1r+goDJ4sY94l2VgKOnB534gFUzzVnFirsoHQoMuTe4hSVrmygpjWWvztDENgOC7KXJhQ1hMdg/nEs3xykCE4e+De2J9F2rb45Ty5Y+p6BEfM8c+WftX5uq5jCsVZxBuF7+vLIEX8qWoUlDHVDeFYN9WvQy8kIhnwiOsSCAnCBI2qvMx3pDvf+1ZSKzEfOjclxpYKbOZoa+WSBMEasvhcQC5LU1F5MdDZbwI3Vg== 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=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=QVkeB7iAyOpsyZzok3gHzZf6pNc/u9xhlnAI6NFRhJU=; b=d3IwLcUa9LgKwMUvgPbu5A8js1QYwAUCspp2OmUunYHNLarfunpHXwoRIDDHektNEma/UQPBsg5g/9o6QCXWIc0n9t8GTqozwT82Vzdi8ZUN8FRIdQ3PkoE2EshmZ7WN1sIjJ1QZjYR8l6YK/H/smqb1me+/pf35eh7++Dkw1CHFB4aVFvJyaKDJW1F8pdwCIzqodh2k/zFESEr+6/3x37+j+lSR2eztMuiQL0kgmt/cKi4tTZxBU3kD/e5iMvhhbvHtH1F6OSnw/Bhn+s6nEhilAqSifpOmjYHZEZnUZq6SpiumZgvckZgkIwlj3xAv0imk76IGZIYWAYg8Uw/g4Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by AM0PR04MB6868.eurprd04.prod.outlook.com (2603:10a6:208:18c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Wed, 3 Dec 2025 09:00:45 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9366.012; Wed, 3 Dec 2025 09:00:45 +0000 From: Carlos Song To: frank.li@nxp.com, mkl@pengutronix.de, broonie@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, kees@kernel.org, gustavoars@kernel.org Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Carlos Song , Frank Li Subject: [PATCH v3 5/6] spi: imx: support dynamic burst length for ECSPI DMA mode Date: Wed, 3 Dec 2025 16:59:48 +0800 Message-Id: <20251203085949.2922166-6-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251203085949.2922166-1-carlos.song@nxp.com> References: <20251203085949.2922166-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0P190CA0017.EURP190.PROD.OUTLOOK.COM (2603:10a6:208:190::27) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|AM0PR04MB6868:EE_ X-MS-Office365-Filtering-Correlation-Id: 987927b4-afa8-49f8-1f14-08de324a7168 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|19092799006|366016|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?RPGfSagLjFq4jhu/FrbTlCkyklXej9aXLZMQeEmkQ3hF1wJLs4NMC+cdJU4+?= =?us-ascii?Q?gq2OQFkPcEef+jjQ4N6+a5/H7vxVX3/Lqgyzt8BNoMXQvNRQ29nDDUy6QEiL?= =?us-ascii?Q?1/CagiBzG1tFCVP6omTUr+iwwon5zgmdtCSioCajHHgWsy8EsYVi3xy8YOhO?= =?us-ascii?Q?8wxmC2D/LJShXUk8MusQ2QfRa9nu1DCei8tWTWWl6NF4nQFPTgMCP/V2fuks?= =?us-ascii?Q?67/B84rPCa7RAmxElv/hkZRI49T01zk5V2FPSpxRkaW2Izxucabl7vSNo3iY?= =?us-ascii?Q?ifkDeCqDXUpiCAyNAnQ1qdsl1Wq/xrF3kJKSXMPMH5/cHBy2OOKGWp/bUADW?= =?us-ascii?Q?r2g2Mnz67vGAPrMnTYLlL7mNyjAaYRIx8VHkWB+eW3AoOYBsU/4uInWi9n44?= =?us-ascii?Q?RCS8V/BPst5rRgD0VwvsB4X0oDMGyvL13XCPJpd0HnMevKXxdMm+7ZI1Wjav?= =?us-ascii?Q?y/CO2x+xsnsVh7sxeX3c/HuxzpBlemHIDVIFgUU7kMD9HApA43EBCBX1EwPs?= =?us-ascii?Q?7IuLFUE7W2sOiOW8YTFyqJlEGaMEBlnNTITRvI6eNVxa1BkNylGem9XgCGLg?= =?us-ascii?Q?Jwjk12bNuwG2Gnzm2H6YrLs3ZgD4zj6RO0+JaHLOxaZ80aZaYTkY3XSOHLfw?= =?us-ascii?Q?CizBiIbIFoITtlzjayEeohlxM4RhhFFykT3yCdshRkY4MLzkl5zC/Te3xGeY?= =?us-ascii?Q?aYk03D4WkBcWsGRp+0A2vvEwXtUq9NRkTTIIZLCNmHVT1aq1ZejsJQ6h9wID?= =?us-ascii?Q?b6VVTNST99IBJqELR+3h20UeUDXzPxu18US0SnlhVZl7QEztHkbAZHsr/PDD?= =?us-ascii?Q?/nj/cCwZhDxn0i86b5HRSx7EJFs7TBxsZigZs6cr2S4zsxGOefYhtYH65hxy?= =?us-ascii?Q?cMq1ZRXzXdhPw4nWC6iKYGzEXINtvu29bhmKqYFRXPzk6EnKYWqoWg1U4Q1N?= =?us-ascii?Q?ojE+znME82IGBB809DG8GTR1Kukc1jBLBaJBtIPRXuooe/swr0+/yPaiRq1o?= =?us-ascii?Q?I/vddw929A+MhA43zxBgXcO79r3FxolHoZAMM2hO1TilbTVGbBLiOmC/+DLS?= =?us-ascii?Q?jhRva2G+iPYIoWjzyAIXNrRMgRsUVdhOtR/H/yTXlVXAk05TRh46J6okXa1J?= =?us-ascii?Q?Irdu85osKc5kRJmK7EWSDv1l3THS/7XcNvli47sLNdLypZCBz/7HhRztGurx?= =?us-ascii?Q?uuhR5tYfAZyPYOPExkNz+cLh9rnCow0Qh+jkExFVFLM486D0ePQVHd4IdH2V?= =?us-ascii?Q?go0e/a8j1HgYxSOXuj3+bDKL6W8Ko2SCPEnpbODXwYMi7c5yVx/NYuG1Kop0?= =?us-ascii?Q?RkbyUZSsAg+JKcCTAOgeb8ocqv5I7xNHZVZkDUVYf0yjbH4DbtWPF6+2IGNk?= =?us-ascii?Q?VnKg3ly/fHWX5w4m8KT+VlOaPP+/osgIc8q819DIx39VtNIt3aOZlq+Gucd9?= =?us-ascii?Q?NO4rsjntXKsOsWu0FUg2fI0ed19qLvlU4qJpmvNnVnP3j3Ws4yNVF4e0lXOo?= =?us-ascii?Q?TYsra57pj5sgmgFesP9A03Pzv3cAG0Piiv89?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(19092799006)(366016)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?UlbJaMN5bRXALsrKXrpPjYYzhULqHaGIUfpa2HZet10vQVVf0P56XeXkoFPE?= =?us-ascii?Q?ecImTA2405ooMSBkLW5guVKN82lQcnzGHbws5W/LpOGuZSSkcnFD4VgKQBAa?= =?us-ascii?Q?W+kN8Xe9ofuCbtgLyCWRq27gxHgCFhnNvHOnS16C4fv1w7X1rbtyC0O3PH1O?= =?us-ascii?Q?/mSjG4CabHr6kRJB6BLyoUsiDE6YZ2oEGBJ82/nOGPCCC9u3c4QEhhQ1gpB+?= =?us-ascii?Q?oN6uvX4wmCCx66RMesXzRvmweZb5m55cEWlskz7vFsO1XHic+JeqRv2CgTZl?= =?us-ascii?Q?F8ENRnEmlsx2v1T6eOqRXPGQPSfRntN7EW/qXozydmt2uMQoKtCmXB/rzrAR?= =?us-ascii?Q?/M5Yd0+jX4YY4RDftm8hVCNDcuWApMnBqlGLeS2C3+lcObEgYy2FyEnCGZpC?= =?us-ascii?Q?Nx+XpqxjanJh2Oi8vCRJz8ByxqvDXixSFkoFF9R6oCfPmqPqAzuk7mafzSSN?= =?us-ascii?Q?49vV3oQZ6ZhGVbhYWilCRIDcnCmYBQdSCDRGbn3123uCh4iC6beOagrkjFiZ?= =?us-ascii?Q?td3JNvPkCty21jZrxkoNORz8YqobuOwZqr+ySS1bkjWGCdGWvKvKzBZQySDg?= =?us-ascii?Q?jlKvILDAcsQFYCTjwhgS4M1IdxRfMlq2cTHhRyByO0ujlKyUVrmXXzATCRo4?= =?us-ascii?Q?4RIFt7uN9b4oxbXEM3IK8teL/4cSC5lRxX/9k1Z0H5aE5tQtUulDKwDbJZcI?= =?us-ascii?Q?YN3dU8mNssf/inn4hOi9srXvmAxvFYl+UEp+CvToxvCKUu5ek6HOKxjO2OrB?= =?us-ascii?Q?IwgWKb7simg2+67t+G3XJJqAfsiLK1QeI9A1Sccy43XnkFYD2bIqAcAQYabo?= =?us-ascii?Q?g0UU6+OSt70DPvL8bbkayHtnJNCDWidDQvMtcWfuaYd6ZS6fxiTw0tqOhfX+?= =?us-ascii?Q?07dNhTm5JMqHJ4xn9Do9AAlXQHTJv/0pi3FQTsenX9kcj2OYJk2X2atrdTny?= =?us-ascii?Q?crfkytVPndcRR+uFIvMUScZlhaudAnJhnVpOlyJpsDqgN64f5Zve2ybckC1O?= =?us-ascii?Q?G4X/bVuDhz8eKNvjVsPhnryvCGOoeNO+NCtZ2LQNammkQOJrls2H5lqTkkfj?= =?us-ascii?Q?js6d/2Hni/SI6kJEw56ZIPIfNmoEl1DR6aRPtkg58aqBhczTWx+33/YQvsEe?= =?us-ascii?Q?MlmrR0T2BkkEdNaLA3A+qzHJ3OBV6RPNtH+LKZxAOt7oLZ0LLP3PdE+6AOZF?= =?us-ascii?Q?pXsfoQ4em5KJjVt1CWoA3VxYiazsrbRTEJrWs98vd579CBbqfYhpXR6yHrCc?= =?us-ascii?Q?RQcTM3RVlBfncH/qXP5CNKcxx7DJxV0nZWY8OkfPrHkKz3eaFHA0jPvo7xOA?= =?us-ascii?Q?DiRV18N7x0+Lv5qtjq1IABuEXqF6XWUojJwJhyoR/fxKBCyPRK/yRndrL/oS?= =?us-ascii?Q?tmK3nWeP2PoXtgV9p7OBkjh8vYGHDxp/fbPCvXDBBfIpopAGXio3h1LMPzwA?= =?us-ascii?Q?oYckrGVtgkbRJIwZodt8zjUs0dKr47BBO+k1hFrMl0ADcOilse1wJeLh4IPg?= =?us-ascii?Q?SCFQmcRbmOI2H0C2pa2MtGD9O7NpJKt+SfbJKJPr0Yb4bQ4T7kzWfu4WO1b8?= =?us-ascii?Q?za+R7S0DNZcmZp/cjc93uLO+kItgO5IJ0S9OAm1V?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 987927b4-afa8-49f8-1f14-08de324a7168 X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Dec 2025 09:00:45.3592 (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: 4ye57I6jhS73wQL7/RGIFFrSHJN6Xqs0iFpfg1OKeXBF0k52Hnb2EAUCek+Cr38HEyQa+SufF4ApFXo+SiUmdA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB6868 Content-Type: text/plain; charset="utf-8" ECSPI transfers only one word per frame in DMA mode, causing SCLK stalls between words due to BURST_LENGTH updates, which significantly impacts performance. To improve throughput, configure BURST_LENGTH as large as possible (up to 512 bytes per frame) instead of word length. This avoids delays between words. When transfer length is not 4-byte aligned, use bounce buffers to align data for DMA. TX uses aligned words for TXFIFO, while RX trims DMA buffer data after transfer completion. Introduce a new dma_package structure to store: 1. BURST_LENGTH values for each DMA request 2. Variables for DMA submission 3. DMA transmission length and actual data length Handle three cases: - len <=3D 512 bytes: one package, BURST_LENGTH =3D len * 8 - 1 - len > 512 and aligned: one package, BURST_LENGTH =3D max (512 bytes) - len > 512 and unaligned: two packages, second for tail data Performance test (spidev_test @10MHz, 4KB): Before: tx/rx ~6651.9 kbps After: tx/rx ~9922.2 kbps (~50% improvement) For compatibility with slow SPI devices, add configurable word delay in DMA mode. When word delay is set, dynamic burst is disabled and BURST_LENGTH equals word length. Signed-off-by: Carlos Song Reviewed-by: Frank Li --- drivers/spi/spi-imx.c | 413 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 377 insertions(+), 36 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 42f64d9535c9..04a492e7dbeb 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -60,6 +60,7 @@ MODULE_PARM_DESC(polling_limit_us, #define MX51_ECSPI_CTRL_MAX_BURST 512 /* The maximum bytes that IMX53_ECSPI can transfer in target mode.*/ #define MX53_MAX_TRANSFER_BYTES 512 +#define BYTES_PER_32BITS_WORD 4 =20 enum spi_imx_devtype { IMX1_CSPI, @@ -95,6 +96,16 @@ struct spi_imx_devtype_data { enum spi_imx_devtype devtype; }; =20 +struct dma_data_package { + u32 cmd_word; + void *dma_rx_buf; + void *dma_tx_buf; + dma_addr_t dma_tx_addr; + dma_addr_t dma_rx_addr; + int dma_len; + int data_len; +}; + struct spi_imx_data { struct spi_controller *controller; struct device *dev; @@ -130,6 +141,9 @@ struct spi_imx_data { u32 wml; struct completion dma_rx_completion; struct completion dma_tx_completion; + size_t dma_package_num; + struct dma_data_package *dma_data; + int rx_offset; =20 const struct spi_imx_devtype_data *devtype_data; }; @@ -189,6 +203,9 @@ MXC_SPI_BUF_TX(u16) MXC_SPI_BUF_RX(u32) MXC_SPI_BUF_TX(u32) =20 +/* Align to cache line to avoid swiotlo bounce */ +#define DMA_CACHE_ALIGNED_LEN(x) ALIGN((x), dma_get_cache_alignment()) + /* First entry is reserved, second entry is valid only if SDHC_SPIEN is set * (which is currently not the case in this driver) */ @@ -253,6 +270,14 @@ static bool spi_imx_can_dma(struct spi_controller *con= troller, struct spi_device if (transfer->len < spi_imx->devtype_data->fifo_size) return false; =20 + /* DMA only can transmit data in bytes */ + if (spi_imx->bits_per_word !=3D 8 && spi_imx->bits_per_word !=3D 16 && + spi_imx->bits_per_word !=3D 32) + return false; + + if (transfer->len >=3D MAX_SDMA_BD_BYTES) + return false; + spi_imx->dynamic_burst =3D 0; =20 return true; @@ -1398,8 +1423,6 @@ static int spi_imx_sdma_init(struct device *dev, stru= ct spi_imx_data *spi_imx, =20 init_completion(&spi_imx->dma_rx_completion); init_completion(&spi_imx->dma_tx_completion); - controller->can_dma =3D spi_imx_can_dma; - controller->max_dma_len =3D MAX_SDMA_BD_BYTES; spi_imx->controller->flags =3D SPI_CONTROLLER_MUST_RX | SPI_CONTROLLER_MUST_TX; =20 @@ -1437,10 +1460,259 @@ static int spi_imx_calculate_timeout(struct spi_im= x_data *spi_imx, int size) return secs_to_jiffies(2 * timeout); } =20 +static void spi_imx_dma_unmap(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data) +{ + struct device *tx_dev =3D spi_imx->controller->dma_tx->device->dev; + struct device *rx_dev =3D spi_imx->controller->dma_rx->device->dev; + + dma_unmap_single(tx_dev, dma_data->dma_tx_addr, + DMA_CACHE_ALIGNED_LEN(dma_data->dma_len), + DMA_TO_DEVICE); + dma_unmap_single(rx_dev, dma_data->dma_rx_addr, + DMA_CACHE_ALIGNED_LEN(dma_data->dma_len), + DMA_FROM_DEVICE); +} + +static void spi_imx_dma_rx_data_handle(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data, void *rx_buf, + bool word_delay) +{ + void *copy_ptr; + int unaligned; + + /* + * On little-endian CPUs, adjust byte order: + * - Swap bytes when bpw =3D 8 + * - Swap half-words when bpw =3D 16 + * This ensures correct data ordering for DMA transfers. + */ +#ifdef __LITTLE_ENDIAN + if (!word_delay) { + unsigned int bytes_per_word =3D spi_imx_bytes_per_word(spi_imx->bits_per= _word); + u32 *temp =3D dma_data->dma_rx_buf; + + for (int i =3D 0; i < DIV_ROUND_UP(dma_data->dma_len, sizeof(*temp)); i+= +) { + if (bytes_per_word =3D=3D 1) + swab32s(temp + i); + else if (bytes_per_word =3D=3D 2) + swahw32s(temp + i); + } + } +#endif + + /* + * When dynamic burst enabled, DMA RX always receives 32-bit words from R= XFIFO with + * buswidth =3D 4, but when data_len is not 4-bytes alignment, the RM sho= ws when + * burst length =3D 32*n + m bits, a SPI burst contains the m LSB in firs= t word and all + * 32 bits in other n words. So if garbage bytes in the first word, trim = first word then + * copy the actual data to rx_buf. + */ + if (dma_data->data_len % BYTES_PER_32BITS_WORD && !word_delay) { + unaligned =3D dma_data->data_len % BYTES_PER_32BITS_WORD; + copy_ptr =3D (u8 *)dma_data->dma_rx_buf + BYTES_PER_32BITS_WORD - unalig= ned; + } else { + copy_ptr =3D dma_data->dma_rx_buf; + } + + memcpy(rx_buf, copy_ptr, dma_data->data_len); +} + +static int spi_imx_dma_map(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data) +{ + struct spi_controller *controller =3D spi_imx->controller; + struct device *tx_dev =3D controller->dma_tx->device->dev; + struct device *rx_dev =3D controller->dma_rx->device->dev; + int ret; + + dma_data->dma_tx_addr =3D dma_map_single(tx_dev, dma_data->dma_tx_buf, + DMA_CACHE_ALIGNED_LEN(dma_data->dma_len), + DMA_TO_DEVICE); + ret =3D dma_mapping_error(tx_dev, dma_data->dma_tx_addr); + if (ret < 0) { + dev_err(spi_imx->dev, "DMA TX map failed %d\n", ret); + return ret; + } + + dma_data->dma_rx_addr =3D dma_map_single(rx_dev, dma_data->dma_rx_buf, + DMA_CACHE_ALIGNED_LEN(dma_data->dma_len), + DMA_FROM_DEVICE); + ret =3D dma_mapping_error(rx_dev, dma_data->dma_rx_addr); + if (ret < 0) { + dev_err(spi_imx->dev, "DMA RX map failed %d\n", ret); + dma_unmap_single(tx_dev, dma_data->dma_tx_addr, + DMA_CACHE_ALIGNED_LEN(dma_data->dma_len), + DMA_TO_DEVICE); + return ret; + } + + return 0; +} + +static int spi_imx_dma_tx_data_handle(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data, + const void *tx_buf, + bool word_delay) +{ + void *copy_ptr; + int unaligned; + + if (word_delay) { + dma_data->dma_len =3D dma_data->data_len; + } else { + /* + * As per the reference manual, when burst length =3D 32*n + m bits, ECS= PI + * sends m LSB bits in the first word, followed by n full 32-bit words. + * Since actual data may not be 4-byte aligned, allocate DMA TX/RX buffe= rs + * to ensure alignment. For TX, DMA pushes 4-byte aligned words to TXFIF= O, + * while ECSPI uses BURST_LENGTH settings to maintain correct bit count. + * For RX, DMA always receives 32-bit words from RXFIFO, when data len is + * not 4-byte aligned, trim the first word to drop garbage bytes, then g= roup + * all transfer DMA bounse buffer and copy all valid data to rx_buf. + */ + dma_data->dma_len =3D ALIGN(dma_data->data_len, BYTES_PER_32BITS_WORD); + } + + dma_data->dma_tx_buf =3D kzalloc(dma_data->dma_len, GFP_KERNEL); + if (!dma_data->dma_tx_buf) + return -ENOMEM; + + dma_data->dma_rx_buf =3D kzalloc(dma_data->dma_len, GFP_KERNEL); + if (!dma_data->dma_rx_buf) { + kfree(dma_data->dma_tx_buf); + return -ENOMEM; + } + + if (dma_data->data_len % BYTES_PER_32BITS_WORD && !word_delay) { + unaligned =3D dma_data->data_len % BYTES_PER_32BITS_WORD; + copy_ptr =3D (u8 *)dma_data->dma_tx_buf + BYTES_PER_32BITS_WORD - unalig= ned; + } else { + copy_ptr =3D dma_data->dma_tx_buf; + } + + memcpy(copy_ptr, tx_buf, dma_data->data_len); + + /* + * When word_delay is enabled, DMA transfers an entire word in one minor = loop. + * In this case, no data requires additional handling. + */ + if (word_delay) + return 0; + +#ifdef __LITTLE_ENDIAN + /* + * On little-endian CPUs, adjust byte order: + * - Swap bytes when bpw =3D 8 + * - Swap half-words when bpw =3D 16 + * This ensures correct data ordering for DMA transfers. + */ + unsigned int bytes_per_word =3D spi_imx_bytes_per_word(spi_imx->bits_per_= word); + u32 *temp =3D dma_data->dma_tx_buf; + + for (int i =3D 0; i < DIV_ROUND_UP(dma_data->dma_len, sizeof(*temp)); i++= ) { + if (bytes_per_word =3D=3D 1) + swab32s(temp + i); + else if (bytes_per_word =3D=3D 2) + swahw32s(temp + i); + } +#endif + + return 0; +} + +static int spi_imx_dma_data_prepare(struct spi_imx_data *spi_imx, + struct spi_transfer *transfer, + bool word_delay) +{ + u32 pre_bl, tail_bl; + u32 ctrl; + int ret; + + /* + * ECSPI supports a maximum burst of 512 bytes. When xfer->len exceeds 512 + * and is not a multiple of 512, a tail transfer is required. BURST_LEGTH + * is used for SPI HW to maintain correct bit count. BURST_LENGTH should + * update with data length. After DMA request submit, SPI can not update = the + * BURST_LENGTH, in this case, we must split two package, update the regi= ster + * then setup second DMA transfer. + */ + ctrl =3D readl(spi_imx->base + MX51_ECSPI_CTRL); + if (word_delay) { + /* + * When SPI IMX need to support word delay, according to "Sample Period = Control + * Register" shows, The Sample Period Control Register (ECSPI_PERIODREG) + * provides software a way to insert delays (wait states) between consec= utive + * SPI transfers. As a result, ECSPI can only transfer one word per fram= e, and + * the delay occurs between frames. + */ + spi_imx->dma_package_num =3D 1; + pre_bl =3D spi_imx->bits_per_word - 1; + } else if (transfer->len <=3D MX51_ECSPI_CTRL_MAX_BURST) { + spi_imx->dma_package_num =3D 1; + pre_bl =3D transfer->len * BITS_PER_BYTE - 1; + } else if (!(transfer->len % MX51_ECSPI_CTRL_MAX_BURST)) { + spi_imx->dma_package_num =3D 1; + pre_bl =3D MX51_ECSPI_CTRL_MAX_BURST * BITS_PER_BYTE - 1; + } else { + spi_imx->dma_package_num =3D 2; + pre_bl =3D MX51_ECSPI_CTRL_MAX_BURST * BITS_PER_BYTE - 1; + tail_bl =3D (transfer->len % MX51_ECSPI_CTRL_MAX_BURST) * BITS_PER_BYTE = - 1; + } + + spi_imx->dma_data =3D kmalloc_array(spi_imx->dma_package_num, + sizeof(struct dma_data_package), + GFP_KERNEL | __GFP_ZERO); + if (!spi_imx->dma_data) { + dev_err(spi_imx->dev, "Failed to allocate DMA package buffer!\n"); + return -ENOMEM; + } + + if (spi_imx->dma_package_num =3D=3D 1) { + ctrl &=3D ~MX51_ECSPI_CTRL_BL_MASK; + ctrl |=3D pre_bl << MX51_ECSPI_CTRL_BL_OFFSET; + spi_imx->dma_data[0].cmd_word =3D ctrl; + spi_imx->dma_data[0].data_len =3D transfer->len; + ret =3D spi_imx_dma_tx_data_handle(spi_imx, &spi_imx->dma_data[0], trans= fer->tx_buf, + word_delay); + if (ret) { + kfree(spi_imx->dma_data); + return ret; + } + } else { + ctrl &=3D ~MX51_ECSPI_CTRL_BL_MASK; + ctrl |=3D pre_bl << MX51_ECSPI_CTRL_BL_OFFSET; + spi_imx->dma_data[0].cmd_word =3D ctrl; + spi_imx->dma_data[0].data_len =3D round_down(transfer->len, + MX51_ECSPI_CTRL_MAX_BURST); + ret =3D spi_imx_dma_tx_data_handle(spi_imx, &spi_imx->dma_data[0], trans= fer->tx_buf, + false); + if (ret) { + kfree(spi_imx->dma_data); + return ret; + } + + ctrl &=3D ~MX51_ECSPI_CTRL_BL_MASK; + ctrl |=3D tail_bl << MX51_ECSPI_CTRL_BL_OFFSET; + spi_imx->dma_data[1].cmd_word =3D ctrl; + spi_imx->dma_data[1].data_len =3D transfer->len % MX51_ECSPI_CTRL_MAX_BU= RST; + ret =3D spi_imx_dma_tx_data_handle(spi_imx, &spi_imx->dma_data[1], + transfer->tx_buf + spi_imx->dma_data[0].data_len, + false); + if (ret) { + kfree(spi_imx->dma_data[0].dma_tx_buf); + kfree(spi_imx->dma_data[0].dma_rx_buf); + kfree(spi_imx->dma_data); + } + } + + return 0; +} + static int spi_imx_dma_submit(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data, struct spi_transfer *transfer) { - struct sg_table *tx =3D &transfer->tx_sg, *rx =3D &transfer->rx_sg; struct spi_controller *controller =3D spi_imx->controller; struct dma_async_tx_descriptor *desc_tx, *desc_rx; unsigned long transfer_timeout; @@ -1451,9 +1723,9 @@ static int spi_imx_dma_submit(struct spi_imx_data *sp= i_imx, * The TX DMA setup starts the transfer, so make sure RX is configured * before TX. */ - desc_rx =3D dmaengine_prep_slave_sg(controller->dma_rx, - rx->sgl, rx->nents, DMA_DEV_TO_MEM, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + desc_rx =3D dmaengine_prep_slave_single(controller->dma_rx, dma_data->dma= _rx_addr, + dma_data->dma_len, DMA_DEV_TO_MEM, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!desc_rx) { transfer->error |=3D SPI_TRANS_FAIL_NO_START; return -EINVAL; @@ -1471,9 +1743,9 @@ static int spi_imx_dma_submit(struct spi_imx_data *sp= i_imx, reinit_completion(&spi_imx->dma_rx_completion); dma_async_issue_pending(controller->dma_rx); =20 - desc_tx =3D dmaengine_prep_slave_sg(controller->dma_tx, - tx->sgl, tx->nents, DMA_MEM_TO_DEV, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + desc_tx =3D dmaengine_prep_slave_single(controller->dma_tx, dma_data->dma= _tx_addr, + dma_data->dma_len, DMA_MEM_TO_DEV, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); if (!desc_tx) goto dmaengine_terminate_rx; =20 @@ -1521,16 +1793,16 @@ static int spi_imx_dma_submit(struct spi_imx_data *= spi_imx, } =20 static void spi_imx_dma_max_wml_find(struct spi_imx_data *spi_imx, - struct spi_transfer *transfer) + struct dma_data_package *dma_data, + bool word_delay) { - struct sg_table *rx =3D &transfer->rx_sg; - struct scatterlist *last_sg =3D sg_last(rx->sgl, rx->nents); - unsigned int bytes_per_word, i; + unsigned int bytes_per_word =3D word_delay ? + spi_imx_bytes_per_word(spi_imx->bits_per_word) : + BYTES_PER_32BITS_WORD; + unsigned int i; =20 - /* Get the right burst length from the last sg to ensure no tail data */ - bytes_per_word =3D spi_imx_bytes_per_word(transfer->bits_per_word); for (i =3D spi_imx->devtype_data->fifo_size / 2; i > 0; i--) { - if (!(sg_dma_len(last_sg) % (i * bytes_per_word))) + if (!dma_data->dma_len % (i * bytes_per_word)) break; } /* Use 1 as wml in case no available burst length got */ @@ -1540,25 +1812,29 @@ static void spi_imx_dma_max_wml_find(struct spi_imx= _data *spi_imx, spi_imx->wml =3D i; } =20 -static int spi_imx_dma_configure(struct spi_controller *controller) +static int spi_imx_dma_configure(struct spi_controller *controller, bool w= ord_delay) { int ret; enum dma_slave_buswidth buswidth; struct dma_slave_config rx =3D {}, tx =3D {}; struct spi_imx_data *spi_imx =3D spi_controller_get_devdata(controller); =20 - switch (spi_imx_bytes_per_word(spi_imx->bits_per_word)) { - case 4: + if (word_delay) { + switch (spi_imx_bytes_per_word(spi_imx->bits_per_word)) { + case 4: + buswidth =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + break; + case 2: + buswidth =3D DMA_SLAVE_BUSWIDTH_2_BYTES; + break; + case 1: + buswidth =3D DMA_SLAVE_BUSWIDTH_1_BYTE; + break; + default: + return -EINVAL; + } + } else { buswidth =3D DMA_SLAVE_BUSWIDTH_4_BYTES; - break; - case 2: - buswidth =3D DMA_SLAVE_BUSWIDTH_2_BYTES; - break; - case 1: - buswidth =3D DMA_SLAVE_BUSWIDTH_1_BYTE; - break; - default: - return -EINVAL; } =20 tx.direction =3D DMA_MEM_TO_DEV; @@ -1584,15 +1860,17 @@ static int spi_imx_dma_configure(struct spi_control= ler *controller) return 0; } =20 -static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, - struct spi_transfer *transfer) +static int spi_imx_dma_package_transfer(struct spi_imx_data *spi_imx, + struct dma_data_package *dma_data, + struct spi_transfer *transfer, + bool word_delay) { struct spi_controller *controller =3D spi_imx->controller; int ret; =20 - spi_imx_dma_max_wml_find(spi_imx, transfer); + spi_imx_dma_max_wml_find(spi_imx, dma_data, word_delay); =20 - ret =3D spi_imx_dma_configure(controller); + ret =3D spi_imx_dma_configure(controller, word_delay); if (ret) goto dma_failure_no_start; =20 @@ -1603,10 +1881,17 @@ static int spi_imx_dma_transfer(struct spi_imx_data= *spi_imx, } spi_imx->devtype_data->setup_wml(spi_imx); =20 - ret =3D spi_imx_dma_submit(spi_imx, transfer); + ret =3D spi_imx_dma_submit(spi_imx, dma_data, transfer); if (ret) return ret; =20 + /* Trim the DMA RX buffer and copy the actual data to rx_buf */ + dma_sync_single_for_cpu(controller->dma_rx->device->dev, dma_data->dma_rx= _addr, + dma_data->dma_len, DMA_FROM_DEVICE); + spi_imx_dma_rx_data_handle(spi_imx, dma_data, transfer->rx_buf + spi_imx-= >rx_offset, + word_delay); + spi_imx->rx_offset +=3D dma_data->data_len; + return 0; /* fallback to pio */ dma_failure_no_start: @@ -1614,6 +1899,57 @@ static int spi_imx_dma_transfer(struct spi_imx_data = *spi_imx, return ret; } =20 +static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, + struct spi_transfer *transfer) +{ + bool word_delay =3D transfer->word_delay.value !=3D 0; + int ret; + int i; + + ret =3D spi_imx_dma_data_prepare(spi_imx, transfer, word_delay); + if (ret < 0) { + transfer->error |=3D SPI_TRANS_FAIL_NO_START; + dev_err(spi_imx->dev, "DMA data prepare fail\n"); + goto fallback_pio; + } + + spi_imx->rx_offset =3D 0; + + /* Each dma_package performs a separate DMA transfer once */ + for (i =3D 0; i < spi_imx->dma_package_num; i++) { + ret =3D spi_imx_dma_map(spi_imx, &spi_imx->dma_data[i]); + if (ret < 0) { + if (i =3D=3D 0) + transfer->error |=3D SPI_TRANS_FAIL_NO_START; + dev_err(spi_imx->dev, "DMA map fail\n"); + break; + } + + /* Update the CTRL register BL field */ + writel(spi_imx->dma_data[i].cmd_word, spi_imx->base + MX51_ECSPI_CTRL); + + ret =3D spi_imx_dma_package_transfer(spi_imx, &spi_imx->dma_data[i], + transfer, word_delay); + + /* Whether the dma transmission is successful or not, dma unmap is neces= sary */ + spi_imx_dma_unmap(spi_imx, &spi_imx->dma_data[i]); + + if (ret < 0) { + dev_dbg(spi_imx->dev, "DMA %d transfer not really finish\n", i); + break; + } + } + + for (int j =3D 0; j < spi_imx->dma_package_num; j++) { + kfree(spi_imx->dma_data[j].dma_tx_buf); + kfree(spi_imx->dma_data[j].dma_rx_buf); + } + kfree(spi_imx->dma_data); + +fallback_pio: + return ret; +} + static int spi_imx_pio_transfer(struct spi_device *spi, struct spi_transfer *transfer) { @@ -1780,9 +2116,14 @@ static int spi_imx_transfer_one(struct spi_controlle= r *controller, * transfer, the SPI transfer has already been mapped, so we * have to do the DMA transfer here. */ - if (spi_imx->usedma) - return spi_imx_dma_transfer(spi_imx, transfer); - + if (spi_imx->usedma) { + ret =3D spi_imx_dma_transfer(spi_imx, transfer); + if (transfer->error & SPI_TRANS_FAIL_NO_START) { + spi_imx->usedma =3D false; + return spi_imx_pio_transfer(spi, transfer); + } + return ret; + } /* run in polling mode for short transfers */ if (transfer->len =3D=3D 1 || (polling_limit_us && spi_imx_transfer_estimate_time_us(transfer) < polling_limit_us)) --=20 2.34.1 From nobody Tue Dec 16 13:27:27 2025 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013022.outbound.protection.outlook.com [40.107.159.22]) (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 EF7342D7D2E; Wed, 3 Dec 2025 09:00:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752458; cv=fail; b=CykJ6Moaum7qFcyEUdU+UZdZkpSNFsBqF0niSfpTTTF8AUruV3QIadIm4opLKUgEaUWP3nxcvBSR5dM8okAhAlQHii3viHOgO0JOc+nRFYQOsFTWEoBKpfeB5q1EOWqwlpDcDy2hCg+c6sWHSeUmm2oz4c8ZeALNNOgxXeFhx+E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764752458; c=relaxed/simple; bh=jkxY2bkg0TcHRYCBDmLxafdUtO4TAzRixmnKbi8rEAo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=I+5DAA0x6p/qK9N/seKNEpu/zQ/PbRiie5S/pyZm/c2Ky7p5MJhWufiKYE7e5yDCyYNhi+afYfWqiR0bxu7UMnX8YZBh0vBPeIM/ZEFqhJjRxrTQ78VHtxkcOmb4CRg4gk+i0HSaC7KMFKGBCFHvaxnkNyXSYn335Qq/MsO24rs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=h85CwMjQ; arc=fail smtp.client-ip=40.107.159.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="h85CwMjQ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RL9H1QIluKc3ZrA7wqKroB/KtYPs1g7coRjdsxVYwM+JjZ/baO1+opuycripbvU+Tt1dY20xLNIdz7KqbEBxHhW6qdQvOGt2mqCd/GFTW9/X6B56gJxcoRMEd1T5Mnj219v6AyXKSO1pZ7HyZ4A66WZjDvoDBT9FimAvoQuEskKvtV6UD089MFr63pNXHcW2CQQKBM4/AAuNRkai+2Vhf3GVjCz5dClFPTDSMy69x8t5oaH4he2+BGTnHIcR/mUSUz1HXsdLK0gvFIUYkvdmh5R5Us6XzuIelenHLOVZ7qqrGEdLCidQOQVpHqKTf9GeHdZY8DWoEKFFLRQPVZGXyA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; 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=J2Pfr5aps/xEZ5KQ2jqoZlAKVnhnD7dxYFk+wcBi31w=; b=LvmF/IGuoxPcU9QnHfDYJLq/ens61Yq+8kQL7BbRyFrsXXIXKJskDsd5K5JV7Qf+q3rU41MBxq+MEVhPmH/W4KIDGs0m+a0xQHkOkSJhHsYpa6/LR9o7hXffBBaqImYzVCPgTvQDZ8srWVIv9P793i7MQVHOmLhkY+fpIw5N0fvQky8+Glp6hyKDNrZb1yikUMvRDOFoXmmolqc1rAbJqfWufrYCfzvz+wLhSR5e2XZK9VVOwhwN5oT4yridXNwFv0GwYw777JUN28NPH8OhRHqAWSUMQ+V4f2i3c9kQZeJtQ+7KS/btZT2ZMpP2nTj65tP08Xy0wEkl/xafGg2P/A== 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=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=J2Pfr5aps/xEZ5KQ2jqoZlAKVnhnD7dxYFk+wcBi31w=; b=h85CwMjQ5fqqc9QUJFVnbcOCy41MkSnzt5gRsFjSaJ4xSZCqSRal1MOKMk258gz43Tnufw8sQbqEuXGvmnm6aJdxNZtfBvnva9HnHBnkZZmQu09OvPokOLXgXl0PLod1dky/xPFSBV3BHP8gukzG7u4KxA+7G3ONbmZHB/IasWVOciV0N3qrJeqqOOwfLmCfBiSws6amIs5FXdFqKwbd75U6aGrO0iSrzj/tnHLPvWG7HTM3jTJKacT2kjyuuhigHxTWDIom7WSsSYQkzvw7QLuQ1FkGZqIG/PFJyCsORbi9Yito2qdOcWboSicWR5qV8TzxN85XuyIiBRwjMLPIpw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) by AM0PR04MB6868.eurprd04.prod.outlook.com (2603:10a6:208:18c::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9366.17; Wed, 3 Dec 2025 09:00:52 +0000 Received: from VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687]) by VI2PR04MB11147.eurprd04.prod.outlook.com ([fe80::75ad:fac7:cfe7:b687%6]) with mapi id 15.20.9366.012; Wed, 3 Dec 2025 09:00:52 +0000 From: Carlos Song To: frank.li@nxp.com, mkl@pengutronix.de, broonie@kernel.org, shawnguo@kernel.org, s.hauer@pengutronix.de, kernel@pengutronix.de, festevam@gmail.com, kees@kernel.org, gustavoars@kernel.org Cc: linux-spi@vger.kernel.org, imx@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, Carlos Song , Frank Li Subject: [PATCH v3 6/6] spi: imx: enable DMA mode for target operation Date: Wed, 3 Dec 2025 16:59:49 +0800 Message-Id: <20251203085949.2922166-7-carlos.song@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20251203085949.2922166-1-carlos.song@nxp.com> References: <20251203085949.2922166-1-carlos.song@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0P190CA0017.EURP190.PROD.OUTLOOK.COM (2603:10a6:208:190::27) To VI2PR04MB11147.eurprd04.prod.outlook.com (2603:10a6:800:293::14) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: VI2PR04MB11147:EE_|AM0PR04MB6868:EE_ X-MS-Office365-Filtering-Correlation-Id: a0b44db4-25e2-4d93-3b1b-08de324a7597 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|19092799006|366016|1800799024|38350700014; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?tlF843RdE8+C+ODP0mKdoMowHQAYUtdl4sNa8FXLiMDCJppyPJiW7xd5eOk1?= =?us-ascii?Q?XI9l7bsWs8Vx7J2ZFJjAUyrPFLdxXYlAwYtI2q+hQaQWbbIQgvivhxPj+1Y5?= =?us-ascii?Q?fpTLFYuVsbIe7EbQt/WaOej3QonnoVakXQvd4KNv5zXP+EgpNBBS6SNd7CpR?= =?us-ascii?Q?HLUn/4sa0jZMT0BVS8ApE8xBd/E3Swd27hwZRTzNfSTCwet1HXuvgAw+XBl0?= =?us-ascii?Q?9MG2AL082KSAc9SImpPy4YJV4uiTkbrqBHTofu2XAzGjlCNtmQX4Y11VatNd?= =?us-ascii?Q?MKQJbw8j975t90SDKZT7oBMbKMf8Xdfssj0lGgYbUQUP8LP68UpFqzZCiEMh?= =?us-ascii?Q?fAIclUs7JjgjRo03Tlsqp2JwLF8UdVJI3AfdMvGhcCNggygf3qo9Tyf1TKg7?= =?us-ascii?Q?sWbGPTxZElv6P/BM08rojnrwBoG7PtKhJQE4P1XJN8ncHEHIecWN4kOiP8Ve?= =?us-ascii?Q?LiY7hDiCJRMFNbQWtWqOxSxLkx2OYzE5erzBp7a/7ctLko1PD4OL9TES3QG9?= =?us-ascii?Q?MgugvAFntnUOG/4yYmp5d38o70h3qpD4+tjCJT/Kjjj5x7iZjycQ8Etb3LlE?= =?us-ascii?Q?ulgjFmCbC+bvbGG8whXbM9gEToF1Bgy6QTJV2fdBMCsDSE5juvlyx0GcQgkN?= =?us-ascii?Q?TPXRk7QR+b6Gi3trvfkiVkZ39ED0p8DGotYr0b1dQpgn1UqEudSMJ/4CCzvv?= =?us-ascii?Q?hKNrJKPnakOd4o2eYX7IIC75e2bVUuGvxq8Xp7AoX0jRZAy9n8ITUUni9Pxp?= =?us-ascii?Q?rDu3UXnBwQ92zMFQPDACn2pIVYZhlG0kZhBnSoYBIpoIChY2pQfT0ZXTIocY?= =?us-ascii?Q?iXd+3wrp3oeLoI/qH7b5/0gHTay4MWKCye9F5OxGELjfdMUO+btSsFLWP81f?= =?us-ascii?Q?DuvTnSOHYqHhxH6damHtq9aLmbLH8J2K79gQtWVu4YMEoPpervmd+C+BPDaY?= =?us-ascii?Q?HiTGh+X49APDX/RPwOtMBfSgW8cTMxwi6d/YvXBYLu8RpUkhAo89r+Lfje8k?= =?us-ascii?Q?13TQJWie/v6PkXarfRA1otznUujDlqWC1xVw1codnz8DTpZ89LjUQ7Zn0Z8s?= =?us-ascii?Q?vbXuzbr6NdFLR1vo5q1tiGxB2ppeUqskPp5MU3lPnMdBbz2Na51wnqBoaTH7?= =?us-ascii?Q?s4YmdHq2lbC3MOXcJtKMv5GT5cjoh55aCongppDF2xDI6tO5u7BN3ZOh1lW6?= =?us-ascii?Q?5/eaG3HvQF/wY1YtxpZlFD9tI+bdWi/n97wVExt9RViuD3oNPrZYXb9VizCG?= =?us-ascii?Q?fJM6+L1S47Iy78i51ADzQhXY2LscXoE/ynbfQu89vsa0CWboaKuJeV5U9IFk?= =?us-ascii?Q?IDl3cIuQNeFBkrtTEh2sj0MNJ7rQZ09S2vSJrTC5XHu5Ng0ZtUhdxa5ktUIM?= =?us-ascii?Q?I2VlaRb2psne13XFjMqibvmoDFAJ13VnhBbzZlKtDFs9LMydPROcSFWCKtmR?= =?us-ascii?Q?34UC1yXqxTvOD5hJBEK3t640WQ89Az+vlckhyByG4GKF8R3kZY1K6bgVH6VU?= =?us-ascii?Q?iUrisCznJHrh3bkjqvWAWNdelYVMPhn9EGl7?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:VI2PR04MB11147.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(19092799006)(366016)(1800799024)(38350700014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?g/m64OiYMNGFVkVkVYZnLgaa75s2K1kE4/lZLMN0nHUjCE21Aj2eAGEH/iof?= =?us-ascii?Q?0um70bisWfSC/ptwzSSqbl6uOGJo+eO4Ti4kArK/TbtUehsFMU4FeIPckrte?= =?us-ascii?Q?ktL2wnnjFc3tCtOO274AsCMSAYaFbExiKC4Yxk5o7sSH0kLAD13Y+07m+m7C?= =?us-ascii?Q?l2nCa/phK0aQKafQWuK0SC+Fr9kMBbJhrKP8+oUtgnSCSzxindMTuix3+GY1?= =?us-ascii?Q?JsH1l5EnYemIw1tryAx5q2opCpmB+gDaIzzyY8g5xJqf7aGTSQCr1X6WV98H?= =?us-ascii?Q?hqvsDS0QQA4rxOuJdhPVPs2gi4GuPfBhvgLZP8QQ01hnczPeR7XDIA1hnexm?= =?us-ascii?Q?5pZK0e/YmX5w2PIbf8kBu7lFCW3zlpu0WPfYXsRzAz2PtGgaVVr43dM8uoC/?= =?us-ascii?Q?zBmAxRrIdt6rodQRTvqaFa/ZLAXrfv9qOzXr7qSq/FvYtjrqgVKxKtG58YAI?= =?us-ascii?Q?FMqW3LcA4MamXNgfbZm3mDRSKZ0SivAipNs7roqdFj9JMsQnvazVIGnkgwgI?= =?us-ascii?Q?I9Ut6+O1VIQ81WKI2pUwesMn3zY4UpRVQNOrVPrORheabMI9//J/16or/00w?= =?us-ascii?Q?0tO+gC4O1wOEPiHdaEL3NfUx4oaf3ITfPH6VNmrrVBO5ux5EH7tLsH0YlOhl?= =?us-ascii?Q?eFbREnayPwcVwVPN5EGJrl5DUbNZ43auRcGX9aaTCw55t1lBwXIGC234q1jo?= =?us-ascii?Q?j67iKxSrK9s5NZSlESiXTwovrKGDG6AyAuzd5+KWcb+EeeoPNny0bQu8+D+W?= =?us-ascii?Q?+in2SG1ukrPpuD7TzbGxqOt+166pR9DJFgjg046c05ApbPe6dm4oS6s3Y+5G?= =?us-ascii?Q?/0uk8PI6rTNzEiAkkLCzJLX6tnhaqkWFT00xk8aY1Mt8JOpWsDDnLX1hJpFl?= =?us-ascii?Q?CB1DrcGC2CbG3jV1DSbRoIZeUYN9ak3a1L9rv/cL3Gf1atPHMEs0AlLLf5tg?= =?us-ascii?Q?Bi44xisc60USpWmGOKOlHARmNqN1INx1XtHA/MuZaiPfK+F3/puSM+pL1seA?= =?us-ascii?Q?VHkkWasev7pB0bqA/t3zOhQT3dUXW1SLCri6Yhsy5s41vGX3Rkwuu5ct7KPX?= =?us-ascii?Q?QWRIiTd1MiwlVzg7inbh6M2Hvfq8NmGULNCjzGuklLdh6yHJpxb8/2ilLBZN?= =?us-ascii?Q?VTWJOLRVJRg/LlI/eMEC7u/Cluh3sXeU9sE/V27CqJPnobzWqTsuZj2fNoGm?= =?us-ascii?Q?+enkvpnWIctRPhfUwK9gLjFfknkQPjX+W7DwDJQRtiD6t0Oa/BCvxpzTTNzl?= =?us-ascii?Q?5G6B6t8h3FHtNxel3GnMRwtVM3BZjaOyYkvF4XJboBfxOJImbaEa7oaulVyL?= =?us-ascii?Q?8ij1l8RsFZFxb1iCUm6dBKF/bxUmCPtgtPVhn7GO+NmC5Q80xEurWTdM6eva?= =?us-ascii?Q?JgNpyv3FtUqRvXbE5XSoeW1oMzilSSuqAiPJYxUVNBTYdG1/iHk48u7qHPpJ?= =?us-ascii?Q?2FvqtABPStER7NeiJH7Rgtjeuds7CLdE+KqZnFzO9X4mo9CSe51ip+pP50Ce?= =?us-ascii?Q?it28hN8GWabC+9eNi37c8Aj4uYQ/jVJHNyr7WWCB1W8kWce7CGSd7ZqC7ohp?= =?us-ascii?Q?gPsKJyzpLiRHg1LvIfeJ2vIGRRWuHDQKFsEVXw3k?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: a0b44db4-25e2-4d93-3b1b-08de324a7597 X-MS-Exchange-CrossTenant-AuthSource: VI2PR04MB11147.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Dec 2025 09:00:51.9784 (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: MVZN0unySKTNSRAHAyIJQqpQs/xEA9mkSRLHmBHjCiwfP2zpzTJPx2GRmTco1B9lfx7EhoQxpAbOytEH8zi28g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR04MB6868 Content-Type: text/plain; charset="utf-8" Enable DMA mode for SPI IMX in target mode. Disable the word delay feature for target mode, because target mode should always keep high performance to make sure it can follow the master. Target mode continues to operate in dynamic burst mode. Signed-off-by: Carlos Song Reviewed-by: Frank Li --- drivers/spi/spi-imx.c | 77 ++++++++++++++++++++++++++++++++----------- 1 file changed, 57 insertions(+), 20 deletions(-) diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c index 04a492e7dbeb..69c288c8c737 100644 --- a/drivers/spi/spi-imx.c +++ b/drivers/spi/spi-imx.c @@ -264,7 +264,13 @@ static bool spi_imx_can_dma(struct spi_controller *con= troller, struct spi_device if (!controller->dma_rx) return false; =20 - if (spi_imx->target_mode) + /* + * Due to Freescale errata ERR003775 "eCSPI: Burst completion by Chip + * Select (SS) signal in Slave mode is not functional" burst size must + * be set exactly to the size of the transfer. This limit SPI transaction + * with maximum 2^12 bits. + */ + if (transfer->len > MX53_MAX_TRANSFER_BYTES && spi_imx->target_mode) return false; =20 if (transfer->len < spi_imx->devtype_data->fifo_size) @@ -1763,23 +1769,51 @@ static int spi_imx_dma_submit(struct spi_imx_data *= spi_imx, =20 transfer_timeout =3D spi_imx_calculate_timeout(spi_imx, transfer->len); =20 - /* Wait SDMA to finish the data transfer.*/ - time_left =3D wait_for_completion_timeout(&spi_imx->dma_tx_completion, - transfer_timeout); - if (!time_left) { - dev_err(spi_imx->dev, "I/O Error in DMA TX\n"); - dmaengine_terminate_all(controller->dma_tx); - dmaengine_terminate_all(controller->dma_rx); - return -ETIMEDOUT; - } + if (!spi_imx->target_mode) { + /* Wait SDMA to finish the data transfer.*/ + time_left =3D wait_for_completion_timeout(&spi_imx->dma_tx_completion, + transfer_timeout); + if (!time_left) { + dev_err(spi_imx->dev, "I/O Error in DMA TX\n"); + dmaengine_terminate_all(controller->dma_tx); + dmaengine_terminate_all(controller->dma_rx); + return -ETIMEDOUT; + } =20 - time_left =3D wait_for_completion_timeout(&spi_imx->dma_rx_completion, - transfer_timeout); - if (!time_left) { - dev_err(&controller->dev, "I/O Error in DMA RX\n"); - spi_imx->devtype_data->reset(spi_imx); - dmaengine_terminate_all(controller->dma_rx); - return -ETIMEDOUT; + time_left =3D wait_for_completion_timeout(&spi_imx->dma_rx_completion, + transfer_timeout); + if (!time_left) { + dev_err(&controller->dev, "I/O Error in DMA RX\n"); + spi_imx->devtype_data->reset(spi_imx); + dmaengine_terminate_all(controller->dma_rx); + return -ETIMEDOUT; + } + } else { + spi_imx->target_aborted =3D false; + + if (wait_for_completion_interruptible(&spi_imx->dma_tx_completion) || + READ_ONCE(spi_imx->target_aborted)) { + dev_dbg(spi_imx->dev, "I/O Error in DMA TX interrupted\n"); + dmaengine_terminate_all(controller->dma_tx); + dmaengine_terminate_all(controller->dma_rx); + return -EINTR; + } + + if (wait_for_completion_interruptible(&spi_imx->dma_rx_completion) || + READ_ONCE(spi_imx->target_aborted)) { + dev_dbg(spi_imx->dev, "I/O Error in DMA RX interrupted\n"); + dmaengine_terminate_all(controller->dma_rx); + return -EINTR; + } + + /* + * ECSPI has a HW issue when works in Target mode, after 64 words + * writtern to TXFIFO, even TXFIFO becomes empty, ECSPI_TXDATA keeps + * shift out the last word data, so we have to disable ECSPI when in + * target mode after the transfer completes. + */ + if (spi_imx->devtype_data->disable) + spi_imx->devtype_data->disable(spi_imx); } =20 return 0; @@ -1902,7 +1936,7 @@ static int spi_imx_dma_package_transfer(struct spi_im= x_data *spi_imx, static int spi_imx_dma_transfer(struct spi_imx_data *spi_imx, struct spi_transfer *transfer) { - bool word_delay =3D transfer->word_delay.value !=3D 0; + bool word_delay =3D transfer->word_delay.value !=3D 0 && !spi_imx->target= _mode; int ret; int i; =20 @@ -2108,7 +2142,7 @@ static int spi_imx_transfer_one(struct spi_controller= *controller, while (spi_imx->devtype_data->rx_available(spi_imx)) readl(spi_imx->base + MXC_CSPIRXDATA); =20 - if (spi_imx->target_mode) + if (spi_imx->target_mode && !spi_imx->usedma) return spi_imx_pio_transfer_target(spi, transfer); =20 /* @@ -2120,7 +2154,10 @@ static int spi_imx_transfer_one(struct spi_controlle= r *controller, ret =3D spi_imx_dma_transfer(spi_imx, transfer); if (transfer->error & SPI_TRANS_FAIL_NO_START) { spi_imx->usedma =3D false; - return spi_imx_pio_transfer(spi, transfer); + if (spi_imx->target_mode) + return spi_imx_pio_transfer_target(spi, transfer); + else + return spi_imx_pio_transfer(spi, transfer); } return ret; } --=20 2.34.1