From nobody Sun Feb 8 22:43:08 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021125.outbound.protection.outlook.com [52.101.125.125]) (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 2A1523314DE; Sun, 18 Jan 2026 13:55:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.125 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744504; cv=fail; b=S8C/of66xe/Ps82KgNnAg+7e2yyotfcmDgeLeM9wZY3gtj5UbMyZXFflb4rDy0mCS1xUbqNpoTkTNFkr3xQE/A22v5yknNXyZ438PKIVrBImwP+F4IlWWbNcKr277GL6BZ4jd5Y/mNR3YVEONxOtLqUqg+Ji3WDQ+CaEJkbdwDE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744504; c=relaxed/simple; bh=7Uv+GcvL0je3yWvBCeI1aZO95RKxL58xTcLK5kBn60Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=bj0Wi80dFfoAQ1KP/8DBRS30LNyamucXTAueMEorpmyFKN2J3TiSjuuz2GJXQ1fCZoePqy5I8pDeCF4xQGGSaLkmr4FmV+mmqV7beEWVi+v4Wk+nJzMFOALp2OZjet2eDsrj4LAPVzaU+VJ9/xzobeuyjx902EKipJvPOKIT5kk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=karGdPNS; arc=fail smtp.client-ip=52.101.125.125 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="karGdPNS" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=qXWhiqA6w8wqLtzhXcgM9y3q7nUye35hX5b0fMGdR3EyzIksg/e98zgm59w7f8CYNEcaBqGZuZTkmpfzJxfdMlOvHIODHivSnO99iYdBfGbgLMHmVI7+vdoqQJiyy0PppdPLDbktSoZKfrEBAtFLMasvivy/71saffkuGcdwe3d59OoNP5dtrv/r6XVq/yKYzyR4c3Ge9LpeSOme0Yv/VJbtUVPdCDNQMsbitbXZvLlbuyONdh4NPtCJE3E1W1KW4psf6XVF241k+++vd2oQxEORiBfWnxDKZJxfusnxC8ylvWrms9aOeUvGE6XeZN9wPhJvObuUxvMsK6kydjJyCg== 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=y46Glu+SnqRJE8SQm0RjDy1uu6n0YABOfLNTNLkw0jI=; b=ppuZ40vc63R5LiFng5gkICa229VF4dHMrj0lfO59rHvcsMXOeFtsAU/Fh4K8uHkLbu3cHBlUTe8nEDWtUu/xfRztRp1o78nEGnZJrzHj23arEwbZMAQQGzgb7CXeKbfkevO1H7V2zSQqJ3KR6K0XE9p51iL4P6Rf/lnFKJ94sG30RSlp1NyDcVqMYffLBD8ej9q8fRjHMRORIC/kEjoyKYDQspr/CRKnci9fQGgzyDckKgQ+/8SFBasDj9VoxUhVyakYnpInrKoC7JFyidqpzIX3TI8wQ54gjELIFTSsD/7+yvCR+Lop8XKkEyCT7xCBrUhkQ8xz5pSluyqQM65pPA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=y46Glu+SnqRJE8SQm0RjDy1uu6n0YABOfLNTNLkw0jI=; b=karGdPNSRVIcLqSIT43pyuj3kVbf7bzlC2f8K8eLAii3upjF8LHxWD8Vtl6kW/4xRpux7Cw/3z3btC79nuNOw1qKo3xrwSY6+2/vcvCNvZdel/RrHRkpVNQoN/+Vp0ui9WORBk3ecitY4lXeb9ddzApdEH6sozCyJkAsd+qv8xU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:54:53 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:54:53 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 01/38] dmaengine: dw-edma: Export helper to get integrated register window Date: Sun, 18 Jan 2026 22:54:03 +0900 Message-ID: <20260118135440.1958279-2-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYWPR01CA0034.jpnprd01.prod.outlook.com (2603:1096:400:aa::21) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: b8032315-9b1a-4514-2360-08de5699278b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?jPV8fLMGL4NrELE0Q2L3NAbRLFP/X0rAay4U4wvVA/uI2OWl2t+gDX4JLSnc?= =?us-ascii?Q?3jTORnCfts1ewndmfbs03S7y2ovUsqJpjdEArpyQJl+imXHvRDWHReyTSfDB?= =?us-ascii?Q?Bi7wnA+b2+Ee1r3p69QVuSWj7OlvwJZinjVnCrZ9udL3PxpnIhwHloAdajc3?= =?us-ascii?Q?+W3wM2qoAnVg5oBhG6xFqg3oXLI53L9Pj/AtEk7uOVYCnxsNK70eIe7+3woY?= =?us-ascii?Q?nKXqJI6YLMUoyRI2ticise1zXhW758y7ES/r6VVwIDTHC22YMDE1PniG1hPc?= =?us-ascii?Q?BMMdp1XiTlnJT3FxvptEqbe88PM9y5nQR/KHlqPInxOQyFrBUdGrr1vmCDHi?= =?us-ascii?Q?flU/2XGtLXLYAs+2tl8p06PdPTvXP2uu/+en23EOz3JwRqbSdiynyjhiIgq+?= =?us-ascii?Q?gEQ+H0M7R7SJWAQ71ibW3AhxvjNTAtjM3PgmRIMJN0zufa+MmGGd9lKG/Ql3?= =?us-ascii?Q?JdoKLD1NuhlrD9QlHloiEiEIPReV9xAxuYiQRtlLOAH7LeQflxGQINczpNpP?= =?us-ascii?Q?QaovOt9mB2v/ljJoHUMoGPgGS6uU8NKVjWmr5pHoydqUVzefEL80sySK7q6W?= =?us-ascii?Q?Yf2Dy7dejblf26/IjcQTCZkmFyFfhq8Z7zJgqWfTC++CLH7uijo1hIIVB2ZG?= =?us-ascii?Q?9OHiS9gm1WijiaawteESKbkTFGL8ntHGEXb4YksxDAJzEUlUeE9bFALKccX8?= =?us-ascii?Q?T86WBWN+JRraQ4jw2XZdsK0B4KPL0iSQ1+c++VgXjR2Pq1gnYNNcykhD41M0?= =?us-ascii?Q?RYRii//iHyFvnUrlnLWHVk0i0s1d8zcViJusFclhFTE6WeCv1YD0SqbXwCtT?= =?us-ascii?Q?dGSRw7RKgULwr3iNIvU8/eNAOtVfLjkzC62tiT/rKz3IIlFzWPl7ifC+ULxM?= =?us-ascii?Q?PMFHQBZP6yuWFQYUvT51I6omPlRFbnVtFP1GsyAU499pXVZsJorn8VfQTQGH?= =?us-ascii?Q?JznYWnJz63X1Z/BVhYH//6yncFN/mNmQS4pa+4dpzryyOAoiubf4xLjKIfis?= =?us-ascii?Q?mieBU3JQHriiFbwQ7WNkfv3XpAnPKcpPeadY8tNR00cwC04D2G29fxLHZwkJ?= =?us-ascii?Q?JpWvz8IQBPgs4aq31JmAWpT84mZg81JqJdDbenB9AdL01Zw33QeQMWj80lpZ?= =?us-ascii?Q?kTQY2ZazY4dryt42Iogz80JXUUiPSrxEcdoppy0CQnsNL0wrxFA+RYlHeRU2?= =?us-ascii?Q?+356eEjWVMIWjVSL/E/42JZqept8S4QiSqXBeeYGtZePHzLuiM+EE3hFdlYY?= =?us-ascii?Q?E/2owMMufmzSnVRHw8+doahM/LcG5E/0v0j3fKhZzTW3B0fESAg1oexeOndP?= =?us-ascii?Q?uUXfd1B1rON4k0M9jUB68jmu2kajVobDYeSZvTUqqXpPN3QPri2B7HsSnTKM?= =?us-ascii?Q?d7hcdBRFH1deUkqDH/98MEZxlLQKmVeA6l4x6tGAcghmyqaugc7dA4jE2kDa?= =?us-ascii?Q?TH/N5kwgTc81guuOXEE2rM0uHhgpAzUGtxw8IBBcw8B1AdvfJnp3f3eFXd3i?= =?us-ascii?Q?9iQ7DjgYRJxLfpSEfwA4KgUcJcDcF2hKdxJOk591/n2WDB2/652RuacDV8ne?= =?us-ascii?Q?wV/uzyyVrNKPnemN4HKMWd6vmdplBP9+grQmfXnQD8J04OeI6VeMBlqzES1x?= =?us-ascii?Q?iw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?P3KxzwdVmUI6aID+tHXiL5SGpt01cayuoQ6ASYnYSz3m4U2oIBnkg71j77Te?= =?us-ascii?Q?D388uVSsibzsWgcAVzvqGVT9+mLcKJST1xRDkoQzrLjXglzuzUlwgE1Z+tZy?= =?us-ascii?Q?2TKVccQhIdA57EeWa+4XfflI3zLMAHeoY9C727xLQ7VVipmDR2nDxIOInwGc?= =?us-ascii?Q?g9p2AIabai3UGQ1k1GoKnY3mE5/xL72II0EJ9ykfOePDlF7xnw3h7v05J5B/?= =?us-ascii?Q?O4fphWzUpfwuHsWFZX3A+1RS31ljEJrj80ftuO+IBzdFh+cF9XpOpVJRUFQI?= =?us-ascii?Q?uCv6jLyVjM5In4+Uv3CDJlSWQeInWqtEH+tkhhV9NAcyb5CtXpFgP980bGXQ?= =?us-ascii?Q?O/c+XaKt01tMywyHORWz4U8wvd+hBxp/nkONxYZWpugV4B8gLmqsuDVCy+fJ?= =?us-ascii?Q?7I3XdVRdt01IBLnNbiy9bvBdtSe2dhKMG1PHjD6VgounZ9gs+WoDvYaASrVo?= =?us-ascii?Q?mRynn5Em/ivFkiZc4RLNLzBkN1JSK3iZqxVDzWx15aoUyIQmmerlxTmRyzLr?= =?us-ascii?Q?GwQim4t71QlxY5SkvvfhvnrCUGXB5B10b1IKhAN2jsXSAILMbrKA+/ZtopKv?= =?us-ascii?Q?gg/BROpdcsEb7JnjkWwucHvRWJUTkBuRuLId4OcGfbwI3Ihb7Cv34ELDXlza?= =?us-ascii?Q?nBTh769+VVTiHB+thU76L1cXHpTFZKyOk5Hsj+ViNnm/qGttUWkPU2dveIJD?= =?us-ascii?Q?c9uzBJ6C+27NHOGIJdApXtaFtahAbW4KWBD27qVvwk6nWX2iE/W1I5Cr3lK4?= =?us-ascii?Q?VuDogBBcCdEP+bzd9jNOclTyw2ATymZ/pdDFsQIoO5yrgQU57W6yyotWcoBZ?= =?us-ascii?Q?EzPQ4AVtKmQpRs/OPAMVcwiENt7YxFK1EFszCTymO4a+o9nhMzGXAIyaaJcg?= =?us-ascii?Q?c7UvoQdJwyc1zUdZJSFfYv2PpEwX9H/JFM0Xvk1gSbQjHJTEl0jBvlteHkKj?= =?us-ascii?Q?+yfJFmePowP0wo+562ap7UFCAthYOMKJynGJG3zVYRjicNEq7jVLGEWwozUG?= =?us-ascii?Q?4JJFMrFQi51UTHYYXYoTZQod2ca7bHcAfbOP3jHslSG5KPzscLh/rJ25Fpy/?= =?us-ascii?Q?+sLM7IGPvLGc5zlRHpdUgQmysR2/tBJ52xEUB6LsDHj2j/3dX/MofEYiCd7W?= =?us-ascii?Q?lSiGFHvKekb6W6GW3ARWjHEYkUcWn3GkmMP3C8k3tZoy8YO6xY47Z2OGtAq6?= =?us-ascii?Q?QgmPF/rQ+bI3/XRxrVvni0eLVyYJ69a/TPk3INJ4MPudX6jmzQrqBwuv6HY2?= =?us-ascii?Q?0EVJEKvmBD73Cp8p1pG5p+4j4XSPQiUYsEaIQ9MM+Mm+Mdg5qrtzHm5QDWux?= =?us-ascii?Q?tSLvziJPSWviijTP2QmHgR12zn0gY0k7aOchGKrAdwtZpzsqc2OBIMwxTcay?= =?us-ascii?Q?sVoWKhSSBCxUbMP3v9khwzT5DwP/kFnQ4Lp6Exi2b91IK+vJbF3aAzvvof6z?= =?us-ascii?Q?2BGggYRqhLa1lypZCd4hh3FqYe/mcfpf2qGXr9559Klgzh7YSA5+5jOVByij?= =?us-ascii?Q?UF3TSipg+6AfYy0PTEerclpjhxizbIIX9lZEAogZruZFbfojus6VFUXNfPlb?= =?us-ascii?Q?XPEO4UkoQVQ/7Kb4QBWAaitQQfT2CWie5Yj1+PYrQiXN73c22/XpFRX4jxL7?= =?us-ascii?Q?kv5/kMz2u+TSFmUImd/FlP1JW1MzJXWpxXg552vfGyK2mYR1ESyX+6J1ytZ6?= =?us-ascii?Q?FoCLpGf1BGtsVTiZgFpyftoNCRPpIAmvDLujrFkw0UhOphYbCBcqX4iowJna?= =?us-ascii?Q?jri5RxlaLa/h6DXp0oqbWKArgHuOSyXrdaNay0bdXc5S78emc1M3?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: b8032315-9b1a-4514-2360-08de5699278b X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:54:52.7067 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: KqqUljHProuaA2UJzw1E3mdJFQCIzP4Fqmacu4p2LjN6T0n9gBmpF2eA0FszIJ554z8tFGzOI+IX3PJqd/MWBQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" Some DesignWare PCIe endpoint controllers integrate a DesignWare eDMA instance. Remote-eDMA providers (e.g. vNTB) need to expose the eDMA register block to the host through a memory window so the host can ioremap it and run dw_edma_probe() against the remote view. Record the physical base and size of the eDMA register aperture and export dw_edma_get_reg_window() so higher-level code can query the register window associated with a given PCI EPC device. Signed-off-by: Koichiro Den --- drivers/pci/controller/dwc/pcie-designware.c | 26 ++++++++++++++++++++ include/linux/dma/edma.h | 25 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/drivers/pci/controller/dwc/pcie-designware.c b/drivers/pci/con= troller/dwc/pcie-designware.c index 345365ea97c7..ad18b84c9f71 100644 --- a/drivers/pci/controller/dwc/pcie-designware.c +++ b/drivers/pci/controller/dwc/pcie-designware.c @@ -162,8 +162,12 @@ int dw_pcie_get_resources(struct dw_pcie *pci) pci->edma.reg_base =3D devm_ioremap_resource(pci->dev, res); if (IS_ERR(pci->edma.reg_base)) return PTR_ERR(pci->edma.reg_base); + pci->edma.reg_phys =3D res->start; + pci->edma.reg_size =3D resource_size(res); } else if (pci->atu_size >=3D 2 * DEFAULT_DBI_DMA_OFFSET) { pci->edma.reg_base =3D pci->atu_base + DEFAULT_DBI_DMA_OFFSET; + pci->edma.reg_phys =3D pci->atu_phys_addr + DEFAULT_DBI_DMA_OFFSET; + pci->edma.reg_size =3D pci->atu_size - DEFAULT_DBI_DMA_OFFSET; } } =20 @@ -1257,3 +1261,25 @@ resource_size_t dw_pcie_parent_bus_offset(struct dw_= pcie *pci, =20 return cpu_phys_addr - reg_addr; } + +int dw_edma_get_reg_window(struct pci_epc *epc, phys_addr_t *phys, + resource_size_t *sz) +{ + struct dw_pcie_ep *ep =3D epc_get_drvdata(epc); + struct dw_pcie *pci; + + if (!ep) + return -ENODEV; + + pci =3D to_dw_pcie_from_ep(ep); + if (!pci->edma.reg_size) + return -ENODEV; + + if (phys) + *phys =3D pci->edma.reg_phys; + if (sz) + *sz =3D pci->edma.reg_size; + + return 0; +} +EXPORT_SYMBOL_GPL(dw_edma_get_reg_window); diff --git a/include/linux/dma/edma.h b/include/linux/dma/edma.h index 270b5458aecf..ffad10ff2cd6 100644 --- a/include/linux/dma/edma.h +++ b/include/linux/dma/edma.h @@ -83,6 +83,8 @@ struct dw_edma_chip { u32 flags; =20 void __iomem *reg_base; + phys_addr_t reg_phys; + resource_size_t reg_size; =20 u16 ll_wr_cnt; u16 ll_rd_cnt; @@ -115,4 +117,27 @@ static inline int dw_edma_remove(struct dw_edma_chip *= chip) } #endif /* CONFIG_DW_EDMA */ =20 +struct pci_epc; + +#if IS_REACHABLE(CONFIG_PCIE_DW) +/** + * dw_edma_get_reg_window - get eDMA register base and size + * @epc: the EPC device with which the eDMA instance is integrated + * @phys: the output parameter that returns the register base address + * @sz: the output parameter that returns the register space size + * + * Remote eDMA users (e.g. NTB) may need to expose the integrated DW eDMA + * register block through a memory window. This helper returns the physical + * base and size for a given DesignWare EP controller. + */ +int dw_edma_get_reg_window(struct pci_epc *epc, phys_addr_t *phys, + resource_size_t *sz); +#else +static inline int dw_edma_get_reg_window(struct pci_epc *epc, phys_addr_t = *phys, + resource_size_t *sz) +{ + return -ENODEV; +} +#endif /* CONFIG_PCIE_DW */ + #endif /* _DW_EDMA_H */ --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021073.outbound.protection.outlook.com [40.107.74.73]) (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 70D6E32C92D; Sun, 18 Jan 2026 13:54:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.73 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744503; cv=fail; b=FFiMOAQav4XMQ6CJpLpLylPCCVgmY8Rs9n1+8IVhD2Ua6BDIyA8HGt17NlWJcUPYTh6g/EeqsXnzKmpqw43fHeeiEGR1v2uIiE0wxtV5gwzOKly/9s6VnJe1bw08q2RTd+5CQjQV0u7s7TzkfNf18ua2Fq6X6bbgVfp1W5GzoNM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744503; c=relaxed/simple; bh=+iy1xqR4pk8RoncmPQ1Wc8ymJtYNMQg42WJeRMFjjgQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=UmbPE/Kwgize1oXlrSw3Kq3NAjuK2a0a+V9Ru6rkFXt/s2dNUAAMkBZCs2BXDk66Iq5EtEsOMRiHFJh6ftZdN7dLjaFoxxyjy2U/KKlLvgUaHXVadn+kIgXrvGVPM18B7VeS/lZ1SYxXszG8B/cpGoAdoqemlpBm6FaMnX8Nhlg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=u/HVnz2P; arc=fail smtp.client-ip=40.107.74.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="u/HVnz2P" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WQGwLUtsUZ7Wlaoii4hddc5oCIY9poxhq+x6QGfLcaCIgHIja+nctTMvZz3J3V0IpGB5Z/iYursU30f7B3HO9VZD+nSHNLoeMwF1rFyxxPoUUiKr3VH6EEIlJuAFhLAawGga0H2g9uc5UiKLuUErLXfaLP8+a9/92yJ5o/ICYyIYqhIxe47Kj4u3cpPTYPGF+ilJz2A41DUvAPXLDolmXAK1U1aCDXKcE+ZKomHdCtUdj1azlcRTLs/9PmLPbiU2xwQW5MYG+DqLGzYufVIJOBMC8WQFEHVYqKBPaoNdUeaFXU7QjVKDfOM0zx1iNIqttX91jqnnTCwX/x+UJMpCVQ== 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=soYmfl9sH1N0V15SoLhCRg52Cnbyyy1W+L8vWv95LAE=; b=uM6ZumJvNaOjuL2Hz1DWkPzKoGx1MsduNv5dY3+RyBCELdW/xLtNhahiD7u458SRsbpYLiSv56Zzc40qbGHspB/XeJhRLEYzl/KdHsLVKjr2L1y/3OL4x7o7MmZeY2eXiAaklvrlopyj+Q0p4r4Bf0bghu1IVm9zNT/r5jkd3C3+jjMlYmPaLsFmESJ84wsDcXzq6TqLya50K0HM28BpbaoXg908qoRHIvYyzxFs8yKEnEmW2rfLT4Wub5QYvLcYx5SwGQComP0xrTYT49EJbNHdTYOTBruIUYSFilc6zX7hr3HADQbw0del+hradPZm/vRHsBzfpt624O6t1KmeQw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=soYmfl9sH1N0V15SoLhCRg52Cnbyyy1W+L8vWv95LAE=; b=u/HVnz2PLD6fK/lgbSKqofKWrQvFbxppbhJCWPafY2lhsvsHXorsVu2yShoAkOVCLykG5aPM0LNZgRStLAjE3LTrifiZ/xf3lb8MKLvtWpt/6KJauoYjF3ho7egq/k+cgKDns9YtE90EvaoGMJEDJR7IjpWTGfIiYPoylycanE4= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:54:53 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:54:53 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 02/38] dmaengine: dw-edma: Add per-channel interrupt routing control Date: Sun, 18 Jan 2026 22:54:04 +0900 Message-ID: <20260118135440.1958279-3-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYWPR01CA0023.jpnprd01.prod.outlook.com (2603:1096:400:aa::10) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: d541e4a0-66f9-4155-4877-08de5699280c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?URMDkoZV9k/+BfT6aSq4pe7Dp+TJNceVpyszZWPcIOVaVDqvXCtFbp9M9TaS?= =?us-ascii?Q?luuXpqCWXiix6dwZX9buJ5M5wauEfzz8c4IPfUFoIGBX+gcYI8gM2EXEzUB0?= =?us-ascii?Q?/ho6zf/yodmWHERmEsEhfSXOae1KkNBqq1zO5U5ausL5ACe4tkmaNtVpa0x2?= =?us-ascii?Q?qp3TW6QTH1F26LAA57d5Ps8uSg0kX98o8g/nwjiau6EHkCdsVdKDn138TZ8X?= =?us-ascii?Q?JhZNbNwIa0fam84pAUu3Ekn5ZmS/dKzpkzqy/ynifvmotSPfcK6qjnSBrkK7?= =?us-ascii?Q?y8u3QlMItxiWpQRj3cQnQSndqORudnaDcP4CivLF/cKPuP5X1ubjCGBFof+x?= =?us-ascii?Q?S87T4Z2q54+Hi2wsD9N+BknRY/wePZ8RO5GSQ7+eiZRBfFfY5hlaHyreeMK9?= =?us-ascii?Q?hccNaBkSUlU2CAPDyktcYjq24v+kHrWRHjpDM+fLQDRIVNEh3sR001xDt8bj?= =?us-ascii?Q?oIR8uxhBmeLuYs7iCNdNPxMPlZiw4p1xBZusZWyGfwt47wZcx6pQKgvs4mIL?= =?us-ascii?Q?ROK3+6KisPHwus/P5/F4q4hda4fX/5Ggrp0QftB9jQqlAr3O91OiXLBG1g8v?= =?us-ascii?Q?0jKLnabnhTVHWo9L/4S+EJJEs8AmKtbLVaBzNHB8PRpoTOR0S1Kv/Sl5ol4v?= =?us-ascii?Q?vy/Yn2B0YCRmk43KZz/uwMzybIj/I/Wf5/PEC3ezujabY1b2n7WLSQMDTwRA?= =?us-ascii?Q?bQBOkFJ5/vSEpfsL+8XxW5yPmOuU8BX++LC24E4Jv22AMHPu5HQ7NxrQ0OZb?= =?us-ascii?Q?j12MhdZYj/nH2Jb+1BiAnglzkGqjCOd6NHqkoMk4TbK6u3tGF9tNImSpn0Y3?= =?us-ascii?Q?pgr9T1rO12hI9cGCmHqGt+zQJc6EGkDBisNK+2Y10ZgSwK6sJGW7JpPEys5a?= =?us-ascii?Q?AcyWtAMasBvKD7LNxOKTicYO6Fts9R8XmgW59InMlW2SPA/xAYW7dezELww1?= =?us-ascii?Q?qIPdzybsZluxREMszv86S9XbNJyfIGqSGdMuqGWHx3V/gQYRKsr/VDdLYagS?= =?us-ascii?Q?7Y0zVKKcB/kTuglFvdaUDiBUYdTbYxB3Pi9rVXOwEfMNZM0I96J8RzypVczJ?= =?us-ascii?Q?vOtms0bMj66wnSHzWCC1ErPidvwK0UTm7OuTueCTq77HwZHqGE8Xj3sYIe7i?= =?us-ascii?Q?xkecx8QRDDkqEAcuNI8CDGsNk+SL9LjEHO1/WbzsOCtWZ4Jq2mr/GwPkj3vt?= =?us-ascii?Q?/NB+DWfeiw7L/UPYzaACCs+DXrpV3/uDEAITta/85N4yUSPuE4vJxqoLInFd?= =?us-ascii?Q?5EaVvuVZdSiDUJLqaYrqe7dRoMZtPlqwY5vAlTj+pVvM99tAYDOqs0AfWQiG?= =?us-ascii?Q?zHsRbTppNLC7LZ9GVZdoP3W00BQiWY1iXzBKEN8P/r02irf8NqO+ZM4sR7Bk?= =?us-ascii?Q?fjfzAG30g20aJLZTA/WKF0iDrBC5Hux80udvRlGNtfez1Ydl7NWZSbRgIlpe?= =?us-ascii?Q?x2bJCmKYVUIWwC4/Rz0YlDM7vAAksjWUd3fF7AQns8CU2K3Bh2bVaaCXqs96?= =?us-ascii?Q?tAT7Ntng3c6ubXq5Pcpw1IK5XSMVs4YGQzalBClTMSJX2GkNy86xcLrw5HF2?= =?us-ascii?Q?wLRCBCiyOEC21Mftkh8MK9FB3EObSZxGxuSBAI08jDk6bxfdpO15Miy5drN3?= =?us-ascii?Q?Yw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?8vK/TIeiPMRHso3/LedEx28AvTZ0TDVEJmwNtOFHAgMn331/eF9NAXlcXXoE?= =?us-ascii?Q?G7Llxk4vF47JzW4V7jWtGwOxC3nOdl6q6lUAKL5Bzom7UqVgUZ2eJRD65aO1?= =?us-ascii?Q?4VJPaIOCTHcNGHsrojXa6nF/Gddy8oCBLhEnZ+XkdjVO8UjVjJhqtHkXxNnl?= =?us-ascii?Q?9MsYKRPPJTjKHzrZ+FyB+A1QdostDodaBO9Jxe2Le3VAMotN/zrh5MtcfKwM?= =?us-ascii?Q?MIr9C0iEajYCQ67QZqOPIZwhCMJl+d1fPI3EJu9TFApX6gGGp3wBjBBOrWWg?= =?us-ascii?Q?F0iQ5LD1ZgeXvkRvK1QcX76kr8POltlQf+mFnuiI7NVFAMS4smNXtbg/F6W/?= =?us-ascii?Q?Z+37QMLW1t3/8WXg/MbaH7p+X1z5aQ2NxMSNAbH5Ya7cG/smrezzSRZFt8+C?= =?us-ascii?Q?WDxonzEdgOcGpyTqsVbpkc+WrunwFNW0BNNFhaiB0jXVlEinrM6++YXhMAtf?= =?us-ascii?Q?C/TSs79HQfOChrTY0ndf95AAKzF+cahVG42bh2JScCbHV28ZCBkRtWJ4c2v8?= =?us-ascii?Q?5Pk75g0En5eo5FIZrtL6QHOniCabXqNWhgeCHDAOenhsuqaMIipL4USSxGA/?= =?us-ascii?Q?BxVQ3zIRJpuUK1J2HHtkCD473+MZuwQ7uDl0s9M5kDrZj1Zpo0ARRSleaSiR?= =?us-ascii?Q?Vzco2xMjwbm1cLIqfbXO/nT4siKBEbJzz2gvA5OMWuO8QAcDcTeSEZ8mtdV3?= =?us-ascii?Q?83j+OYWhVpsfzVntMF3DMplMGmO352aTBKEaTHZDkNl3SMV8dPmEZda0YHXC?= =?us-ascii?Q?lN1KmcoD8+mpfAiGATGfWJcB2nIdIkhEwgRo8wPppyKyV9Dn6gWbic2p1yxc?= =?us-ascii?Q?Q9P15lPuVchoBJCgpZ1+UqIdSfoI5Q5g+8ObXrnD+ip+77UBsmibgqmyeudf?= =?us-ascii?Q?TSSo2F9D58ksUgqz4Xch1Wv4NMIklH4Nsaa56alp+DNbviicc1syjnrbXYQd?= =?us-ascii?Q?r9+FhyBfMViI84Hc1Kh8mzTXoqPH5VYaTZsPNzzMUXlxsd1+tjspxYDd4W2I?= =?us-ascii?Q?XR8TT3GLqbOZOtMF8iOToO1pK1Z/SbXZMxx5Fh/4jOZE1r/1aFp361/HjpIp?= =?us-ascii?Q?JDhGA08+1xW53c2Jt95/ZGAc8g4zqddefJo+leaa1vIicr+LLEhGgmsYm1un?= =?us-ascii?Q?OgRo7Wbhco1yjPX74WraczSP8mupW3OHfwK6xkin80MVrI24Mbcc7LYLkLuX?= =?us-ascii?Q?uTZJYPcla0uZiNQ+nSUUd1KAYHY86lI/LRax4FVPik237MS7+CcPkh+EoyE0?= =?us-ascii?Q?yaF2H4XnMOdl6Xo2m1uNkszo/ZLP6oED2wtpOBgnDgFks0MSZfqaC7NfD3bO?= =?us-ascii?Q?AePfV+DvS3xeyERlowmNM7wr+r+Y/I/RMKHGxV6uebTokdd5ov/up/Tz6C6p?= =?us-ascii?Q?zRVvnZBZdfTJx9zLFkNhgDUxwFta7EOPasJyBz8jB50IPSd9bZ4wjymVzdRV?= =?us-ascii?Q?YyCQgJxGzb1l0wBtWuL0hO6P/vxCDCG2ENk5Rj/+qlu1pPEgVDjaObX1BRLk?= =?us-ascii?Q?sGaN7BZfijxAOiYnHslWOcrv8LWB6LRohs/vphc8i2pXgm2RVzySTUhMRAbI?= =?us-ascii?Q?sVBlEfZgKzOdOR1cMoEdj0DA1bKat7/cnc4CRyTRB8l7mhQUVi0xJfHMHZvb?= =?us-ascii?Q?fDOsCKody9FYrzFOCrfLeTM5yk8duMQ73ZW1PkNsN80eEx2OBvBb0qlRMHyW?= =?us-ascii?Q?chZHXniB1SE1h5kJRCTUPyHgtEvLwyv+MiaI0+0c+7g/88wRp07PgNoyBalO?= =?us-ascii?Q?ZZUggd7FoN91JAQUxnub9yCRF4Dq7oBXSJ/fmZaPW8Atw/rX+IEp?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: d541e4a0-66f9-4155-4877-08de5699280c X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:54:53.5483 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 5iK88wo2bkBaQmjOHn0TZwgW7VIBPAcMuRtY8IlcxCusjLVlqwaoxE7knQTOZ6dbDwSHrrlC7rTUk2Sxp1M7Pw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" DesignWare EP eDMA can generate interrupts both locally and remotely (LIE/RIE). Remote eDMA users need to decide, per channel, whether completions should be handled locally, remotely, or both. Unless carefully configured, the endpoint and host would race to ack the interrupt. Introduce a per-channel interrupt routing mode and export small APIs to configure and query it. Update v0 programming so that RIE and local done/abort interrupt masking follow the selected mode. The default mode keeps the original behavior, so unless the new APIs are explicitly used, no functional changes. Signed-off-by: Koichiro Den --- drivers/dma/dw-edma/dw-edma-core.c | 52 +++++++++++++++++++++++++++ drivers/dma/dw-edma/dw-edma-core.h | 2 ++ drivers/dma/dw-edma/dw-edma-v0-core.c | 26 +++++++++----- include/linux/dma/edma.h | 44 +++++++++++++++++++++++ 4 files changed, 116 insertions(+), 8 deletions(-) diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-ed= ma-core.c index b9d59c3c0cb4..059b3996d383 100644 --- a/drivers/dma/dw-edma/dw-edma-core.c +++ b/drivers/dma/dw-edma/dw-edma-core.c @@ -768,6 +768,7 @@ static int dw_edma_channel_setup(struct dw_edma *dw, u3= 2 wr_alloc, u32 rd_alloc) chan->configured =3D false; chan->request =3D EDMA_REQ_NONE; chan->status =3D EDMA_ST_IDLE; + chan->irq_mode =3D DW_EDMA_CH_IRQ_DEFAULT; =20 if (chan->dir =3D=3D EDMA_DIR_WRITE) chan->ll_max =3D (chip->ll_region_wr[chan->id].sz / EDMA_LL_SZ); @@ -1062,6 +1063,57 @@ int dw_edma_remove(struct dw_edma_chip *chip) } EXPORT_SYMBOL_GPL(dw_edma_remove); =20 +int dw_edma_chan_irq_config(struct dma_chan *dchan, + enum dw_edma_ch_irq_mode mode) +{ + struct dw_edma_chan *chan; + + switch (mode) { + case DW_EDMA_CH_IRQ_DEFAULT: + case DW_EDMA_CH_IRQ_LOCAL: + case DW_EDMA_CH_IRQ_REMOTE: + break; + default: + return -EINVAL; + } + + if (!dchan || !dchan->device) + return -ENODEV; + + chan =3D dchan2dw_edma_chan(dchan); + if (!chan) + return -ENODEV; + + chan->irq_mode =3D mode; + + dev_vdbg(chan->dw->chip->dev, "Channel: %s[%u] set irq_mode=3D%u\n", + str_write_read(chan->dir =3D=3D EDMA_DIR_WRITE), + chan->id, mode); + + return 0; +} +EXPORT_SYMBOL_GPL(dw_edma_chan_irq_config); + +bool dw_edma_chan_ignore_irq(struct dma_chan *dchan) +{ + struct dw_edma_chan *chan; + struct dw_edma *dw; + + if (!dchan || !dchan->device) + return false; + + chan =3D dchan2dw_edma_chan(dchan); + if (!chan) + return false; + + dw =3D chan->dw; + if (dw->chip->flags & DW_EDMA_CHIP_LOCAL) + return chan->irq_mode =3D=3D DW_EDMA_CH_IRQ_REMOTE; + else + return chan->irq_mode =3D=3D DW_EDMA_CH_IRQ_LOCAL; +} +EXPORT_SYMBOL_GPL(dw_edma_chan_ignore_irq); + MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("Synopsys DesignWare eDMA controller core driver"); MODULE_AUTHOR("Gustavo Pimentel "); diff --git a/drivers/dma/dw-edma/dw-edma-core.h b/drivers/dma/dw-edma/dw-ed= ma-core.h index 71894b9e0b15..8458d676551a 100644 --- a/drivers/dma/dw-edma/dw-edma-core.h +++ b/drivers/dma/dw-edma/dw-edma-core.h @@ -81,6 +81,8 @@ struct dw_edma_chan { =20 struct msi_msg msi; =20 + enum dw_edma_ch_irq_mode irq_mode; + enum dw_edma_request request; enum dw_edma_status status; u8 configured; diff --git a/drivers/dma/dw-edma/dw-edma-v0-core.c b/drivers/dma/dw-edma/dw= -edma-v0-core.c index 2850a9df80f5..80472148c335 100644 --- a/drivers/dma/dw-edma/dw-edma-v0-core.c +++ b/drivers/dma/dw-edma/dw-edma-v0-core.c @@ -256,8 +256,10 @@ dw_edma_v0_core_handle_int(struct dw_edma_irq *dw_irq,= enum dw_edma_dir dir, for_each_set_bit(pos, &val, total) { chan =3D &dw->chan[pos + off]; =20 - dw_edma_v0_core_clear_done_int(chan); - done(chan); + if (!dw_edma_chan_ignore_irq(&chan->vc.chan)) { + dw_edma_v0_core_clear_done_int(chan); + done(chan); + } =20 ret =3D IRQ_HANDLED; } @@ -267,8 +269,10 @@ dw_edma_v0_core_handle_int(struct dw_edma_irq *dw_irq,= enum dw_edma_dir dir, for_each_set_bit(pos, &val, total) { chan =3D &dw->chan[pos + off]; =20 - dw_edma_v0_core_clear_abort_int(chan); - abort(chan); + if (!dw_edma_chan_ignore_irq(&chan->vc.chan)) { + dw_edma_v0_core_clear_abort_int(chan); + abort(chan); + } =20 ret =3D IRQ_HANDLED; } @@ -331,7 +335,8 @@ static void dw_edma_v0_core_write_chunk(struct dw_edma_= chunk *chunk) j--; if (!j) { control |=3D DW_EDMA_V0_LIE; - if (!(chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL)) + if (!(chan->dw->chip->flags & DW_EDMA_CHIP_LOCAL) && + chan->irq_mode !=3D DW_EDMA_CH_IRQ_LOCAL) control |=3D DW_EDMA_V0_RIE; } =20 @@ -408,12 +413,17 @@ static void dw_edma_v0_core_start(struct dw_edma_chun= k *chunk, bool first) break; } } - /* Interrupt unmask - done, abort */ + /* Interrupt mask/unmask - done, abort */ raw_spin_lock_irqsave(&dw->lock, flags); =20 tmp =3D GET_RW_32(dw, chan->dir, int_mask); - tmp &=3D ~FIELD_PREP(EDMA_V0_DONE_INT_MASK, BIT(chan->id)); - tmp &=3D ~FIELD_PREP(EDMA_V0_ABORT_INT_MASK, BIT(chan->id)); + if (chan->irq_mode =3D=3D DW_EDMA_CH_IRQ_REMOTE) { + tmp |=3D FIELD_PREP(EDMA_V0_DONE_INT_MASK, BIT(chan->id)); + tmp |=3D FIELD_PREP(EDMA_V0_ABORT_INT_MASK, BIT(chan->id)); + } else { + tmp &=3D ~FIELD_PREP(EDMA_V0_DONE_INT_MASK, BIT(chan->id)); + tmp &=3D ~FIELD_PREP(EDMA_V0_ABORT_INT_MASK, BIT(chan->id)); + } SET_RW_32(dw, chan->dir, int_mask, tmp); /* Linked list error */ tmp =3D GET_RW_32(dw, chan->dir, linked_list_err_en); diff --git a/include/linux/dma/edma.h b/include/linux/dma/edma.h index ffad10ff2cd6..6f50165ac084 100644 --- a/include/linux/dma/edma.h +++ b/include/linux/dma/edma.h @@ -60,6 +60,23 @@ enum dw_edma_chip_flags { DW_EDMA_CHIP_LOCAL =3D BIT(0), }; =20 +/* + * enum dw_edma_ch_irq_mode - per-channel interrupt routing control + * @DW_EDMA_CH_IRQ_DEFAULT: LIE=3D1/RIE=3D1, local interrupt unmasked + * @DW_EDMA_CH_IRQ_LOCAL: LIE=3D1/RIE=3D0 + * @DW_EDMA_CH_IRQ_REMOTE: LIE=3D1/RIE=3D1, local interrupt masked + * + * Some implementations require using LIE=3D1/RIE=3D1 with the local inter= rupt + * masked to generate a remote-only interrupt (rather than LIE=3D0/RIE=3D1= ). + * See the DesignWare endpoint databook 5.40, "Hint" below "Figure 8-22 + * Write Interrupt Generation". + */ +enum dw_edma_ch_irq_mode { + DW_EDMA_CH_IRQ_DEFAULT =3D 0, + DW_EDMA_CH_IRQ_LOCAL, + DW_EDMA_CH_IRQ_REMOTE, +}; + /** * struct dw_edma_chip - representation of DesignWare eDMA controller hard= ware * @dev: struct device of the eDMA controller @@ -105,6 +122,22 @@ struct dw_edma_chip { #if IS_REACHABLE(CONFIG_DW_EDMA) int dw_edma_probe(struct dw_edma_chip *chip); int dw_edma_remove(struct dw_edma_chip *chip); +/** + * dw_edma_chan_irq_config - configure per-channel interrupt routing + * @chan: DMA channel obtained from dma_request_channel() + * @mode: interrupt routing mode + * + * Returns 0 on success, -EINVAL for invalid @mode, or -ENODEV if @chan do= es + * not belong to the DesignWare eDMA driver. + */ +int dw_edma_chan_irq_config(struct dma_chan *chan, + enum dw_edma_ch_irq_mode mode); + +/** + * dw_edma_chan_ignore_irq - tell whether local IRQ handling should be ign= ored + * @chan: DMA channel obtained from dma_request_channel() + */ +bool dw_edma_chan_ignore_irq(struct dma_chan *chan); #else static inline int dw_edma_probe(struct dw_edma_chip *chip) { @@ -115,6 +148,17 @@ static inline int dw_edma_remove(struct dw_edma_chip *= chip) { return 0; } + +static inline int dw_edma_chan_irq_config(struct dma_chan *chan, + enum dw_edma_ch_irq_mode mode) +{ + return -ENODEV; +} + +static inline bool dw_edma_chan_ignore_irq(struct dma_chan *chan) +{ + return false; +} #endif /* CONFIG_DW_EDMA */ =20 struct pci_epc; --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021073.outbound.protection.outlook.com [40.107.74.73]) (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 EA9253314C5; Sun, 18 Jan 2026 13:55:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.73 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744507; cv=fail; b=ahraC3AR0j9HAT+KqENvhCqt+uL7sewTsHK2jdeY8v4yhBAqP089o2Le0eyEFOBwJ17spYi461JqyBwr6lbWSqDvrZF7csyYcfy3Fp+XwQ5dgh2bp7SuENfIXEQpaZ+8n9b1Nr/wm70vio92UmLMpolv+5URRc07/tTT4GiH10M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744507; c=relaxed/simple; bh=LbA1Pw4Rm5yX87aTtHjar3yLT506wGvrd8ACC2EVG4A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=k7CouLp2kTV5M8XyIu0hHWF/O5+KUW3pVFFNZvFvplCE/4vg84Z11QaNr8J26h7ivA/pmZjZuSk+wJ+XUIz4gl1P0K3bpGl23RYOwcArEmfQouoIWrdmlLt8bb6fC+XJTd34TvdETzgxypaUQTK4MVDj8YhifA5Jwi+5BL9TwVs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=W+V5JNC2; arc=fail smtp.client-ip=40.107.74.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="W+V5JNC2" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JVJyMCq2gNf1aq52bF8QALxyKipebKbPZNFKV1+lQXngWthlGRYvOWqfyUil98z/+IeM0u2VdeSVvLqIrlTaccPU7x+JlYIPygLiyCLeSQO7sRXddq4PkpaVJILg+ePPqQUTQFFVsQ+KFEBMJXqPhe2DIr6v12jSyRpOiT6FuGSj2I0R7/LjAxEb00BQgwtZXKXTfNUYI9ANpoBmwHkxwTOptZv2SeB7WLyu091FyliR0iVAbbyum+8DYGdUpBhadLTkkO3LO9tFSFg19c/jOlMJZ8fAwqPIKljJCYd42VCcO5wK7w58QuekHs05x7JtAZ7DKkgbtZIh0ga1zg+M+Q== 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=pS9NFT/Lcpewmml5A4Y5Mt5X7kFL1195M69cHaM411Y=; b=H/ofkGuTHRbrFufoVtFE7zXQjJuGe2CTqbx67WX8r3wrCVF6PdczCsrnBDFQRs7BsSlPeOSNUrs5Im9KwFne7MARzwttAN7cGvGrQfbVZWFHqisomFEW3B/CL6QXY6Z803vN1uE3UpVrao2z1B3qXxxLPYIIUzIkuwV0os9KxAP1NbXmtkyjeMrzD7nhdRe0Rj1kGp44oW93EguxFrhhvlIrSvmNuNXljI3BOgV3Qbdzc5kYx+HfK35ZDmdxSuhUptqXyHuxHBPnuDKTKsC1aABdBlaX7mIoMqo0b8Fw9DwhB9oItzOvpjrLiy9plGpglJvCQT6xh0r9aESJ/wAYEg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=pS9NFT/Lcpewmml5A4Y5Mt5X7kFL1195M69cHaM411Y=; b=W+V5JNC2nqe0rDJyH74cuJZaSCCnzLgovLMfmOEV1V2493Vthvq/Dhho/cBEPao07794mFXFJlQroATs2g2WpJ1VEg6PVq68LNWsZ2jlc7FNt+zVPy0EIeozzvVK3H9a9/Od2yvZVT0SIc0iD4m/kB/CAPjcsIm/XDilANRnSPc= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:54:54 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:54:54 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 03/38] dmaengine: dw-edma: Poll completion when local IRQ handling is disabled Date: Sun, 18 Jan 2026 22:54:05 +0900 Message-ID: <20260118135440.1958279-4-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0114.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:37c::12) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 9c433e0a-3b34-401b-c79e-08de5699289a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?W4ECmIjxSUHu3oqQUmcVeLggcsf3VJtuH3xCWgIsAzPF3Aa1Z5o2CGmBydUu?= =?us-ascii?Q?ea4+H4Wmrl3SrxVZXJmImBpSO+pDbJUHFOy1N9szqfepAAIC6YRXfEWv/9ez?= =?us-ascii?Q?i4Bc9iP9X8AvWqzDMizvAxjD7frofCjCAL9wrIn7oMT3z/rP9EW6JPL8Y34h?= =?us-ascii?Q?nGUXdyd0WXkODY6Q7zmBnwmJIyBZxTZ5zEbJXj8h23Fq6h6ezAdADfxoC/xl?= =?us-ascii?Q?HGT0iPhWIxvPVz4Th1DCKUUvY6pA3Shk31c7wVt5eKCrho0ig24HT9lsoegi?= =?us-ascii?Q?N6jar53Y9inup4mcqQwwfxIBQ3WPaQF8KjHV7a43SjuTvmJ9euNJP2oBrtil?= =?us-ascii?Q?+Evpzj4/BNdQR/XVU+LObRWVNlWddiUZYs+BQy5/cC6J1jS211x8tay1TKLz?= =?us-ascii?Q?Ynne6bYvLIJZrEmmFNw7mow8n3HgKr0z8lvploYG+OeIwx+Rkb+o4BcgMTeu?= =?us-ascii?Q?2eTAGzie88j1w+YVEdI56r9UMC/8/w490dIZhOU69L2LrZfi0madLQo2Fezd?= =?us-ascii?Q?O3EwNcCHPE3Ui/HvrN2C1IbRbB3K7ABeN9GPVQEGvGiks+hpzaj9s+CIiVkw?= =?us-ascii?Q?g7pfiiEUuPF0nJriVZnZ/kw8a7NlL7E86gCt+Fmg/+KDhAEhFbe8GrgXE+ji?= =?us-ascii?Q?XUlSR3eiJsDYDU/wS0xj2bcXAXIaSSyyLm7GjLwiiPs393Sk2j1L3PjBlQMs?= =?us-ascii?Q?nABs8GcG90/m7kUzMM21WvH532EJ8rh7Pcne9llLEj/RZ9KspyhaJ78+vYpF?= =?us-ascii?Q?JH9/FU//fA5vS4XKnXigl0W2P8bgDCkQFUH6aTPrlvwCfIRGbeYKwBBNNGlJ?= =?us-ascii?Q?Xi3ZOJo2p8/2rh9+GKLXJef9kYJuUoJg82jZsjxQZ1ZFeI+gfNPwMrXk2XEN?= =?us-ascii?Q?gB+HnriWKl8wdcxIREtDZvNgRK5MKvYiwKaJM783uhdrYbS8XJKJ2DtuYPt7?= =?us-ascii?Q?nAv26aoWotcEfzLpFjCGuoErd2UUEvFF1gfgESytmfBI46i+9lnyiMfQexN2?= =?us-ascii?Q?duGr/e01GRL064pzMoksB+Ii6Th5Fdc/fqTu+U8kRh6kj2MxOZGE6Z2+yo3I?= =?us-ascii?Q?US6FdDQEKg1ANpNQgTiGapUEzC6sx7phAzk0PyFoFDxPIL9Qu3MY1vTz69kz?= =?us-ascii?Q?szRRyzSRB66Mzc84ePAKm0sY17oIYMkL1mSV/8n3XJuSZMROhToL8rjSQ5Z9?= =?us-ascii?Q?Ey5VOjXwa1K5Ny7oxyViSN3PMUp0stqmz6fY7fe9QM51Bvjjo5h2GqIaFfk1?= =?us-ascii?Q?qZn8MLEXnSRMgY+DyaSFeArrPmAPujMLIDV0JjPaNOcFjnuahkyf/pc7B7wE?= =?us-ascii?Q?VjsxKSxKNXMTPSwFNEKg3kJOYrP5rEnqxa4+LsRDL1m/e2UvIv1MsReelr8a?= =?us-ascii?Q?1YynYPRQYk8JiClYB8iHJWQz5hQn1g3A3dK36WTddifLvRyyR4Ejo433egea?= =?us-ascii?Q?HA7cygW28x3kXL6LBAAClvPa7wy0z/Qp79NqKeRXjTjoeSq9smQuMqLGX8Jx?= =?us-ascii?Q?GD9Co2BgPcj9qfROnNArbrMto3HRVRemC4VFJRd8nI7KgjJV6TNghViiqLgA?= =?us-ascii?Q?of379vLtfG7xhvL8iK+gHvO6eLZ31nFQ7hpKPxa0cn+glKqoNj5l8Q+ovMhh?= =?us-ascii?Q?RQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?6l8pWCYI5lffLP6jjH1vQQ4exAPLelHajBz7xXoIIsc4e6Y4trVu2OxRg9/J?= =?us-ascii?Q?r4EB0/F7Xxbnhe8DPHOw8fA5048OySSaevO6uMH7dClhUtpu+JsWjD7+CCEW?= =?us-ascii?Q?n8kjH3QQ8shuyAlEpzV46yEuv7FXHPaYRJONCmD4uYAZziwDQCzzpnGhzSrP?= =?us-ascii?Q?8r3Mg6yAVMN2Ke5+lydzSUEi4G53VdrcEWIOhySpkXxYrZv3+M/mT+AO0Ony?= =?us-ascii?Q?UGZBVLrxAN0k47sl+PQ+u2w3+52NpZXfZbRyPycOgA3p1BpvJVDmYJ2TMdxo?= =?us-ascii?Q?Rvs/FDUuYrfAILDuONRRItHc3kGvKNVBgG9pInyOtIcr83wypgx4gGMH9/oN?= =?us-ascii?Q?jq/pbExoFtfPd3K4C+IZKcs4Kj/38Zq1gV0QRKwfPACAkFXMJViZbkslqeJM?= =?us-ascii?Q?GPNIEHJPtkDyvbi1RBQ6N2D2klH7+5eLHCMW/07cB+qZj/TI0q99xUET2Jja?= =?us-ascii?Q?fbspUb18OeBuDOskqok3hqNJF/Th+pwu+oUAvHeQXKtPljAPRJrM4HuT1t6Y?= =?us-ascii?Q?SCgeWBSE0Nfui8B4laDLBDnOT2nlLTk/gMDHQZHQ8SdWTUUpxsD20JdSe7tS?= =?us-ascii?Q?H9BKDcn5wo1PjVDdhPg5MZax9Y5NXOcyXF4fdpdVwHH7C6a3onzRJuys1Ly3?= =?us-ascii?Q?Rn7Pm2sY4UDI8V4CH9sr1rfD05AnK+/ZAiM2I4EFo7XBH7/ZYOyHNssRKCrP?= =?us-ascii?Q?EOuNEchiyF/dcYphrvea5fI4RwdyJ29KUb5XkSuIGJm+sxYYqpYRXQVMNS+/?= =?us-ascii?Q?w7u/TCsd7PaSs5gSZXg/tQ12Zo0sHZXKgK3xfGbewbcSX2LY5wCL9LgdbhHa?= =?us-ascii?Q?jvmqyBInjidK6lQWGt5gL07aGOQAtgcw3+Cn4YdM4wGA/mjS+Vu6SGDmIWCh?= =?us-ascii?Q?BMES2m/WOueg9RocP+Sq7XgutlYP0Kpg1DDNRJPGyWqOVQHrdQvkCu/+AmuA?= =?us-ascii?Q?lI5LA5LI0BlsraHXiVOdwsPqEOauJ3H1r5EsdKf1BohxJR+PRY6m8TfBuAXK?= =?us-ascii?Q?Vj8oZ7JEXfJkiYdvYekmfFUCPKlpf6HCCMzoy4cVi6jARKpFAk8Go6Vuf5jw?= =?us-ascii?Q?nHBeh8lPluRdIgahBVz/alKB7AIpuH0BqEsOT95JfWFAy+OBQJyRBF3xfjJc?= =?us-ascii?Q?U0A7SvH4qpk7WkuiDRG6J69Gf1l4IVxIBY8wxYfiguy3maQjbRaVLFjfYeVm?= =?us-ascii?Q?DaXRCK/jjrsVgmKQ+ZKsLOcIzvsA8P9MfvkLQA61eNnCH4pXEVo6M197WxHs?= =?us-ascii?Q?r82Xkg0hFu0SIxDgaSXmomBa32ETfnjutebElz6NVUjQqAPTtBMJbzMXaKoi?= =?us-ascii?Q?VFf4nP56eIDbRqWymY1mSyyGrSZTFSfx706kgamb20X3l/ci3ZXX4bG6iK0J?= =?us-ascii?Q?59EJfgwgX/lenYPG83oe8t+G4F88LqqxdF4kkOdVLhx7wXHMfmnHNBmyrmMa?= =?us-ascii?Q?V5BrB9EYCPzwoJrpDRZ/JJrIvOS0Lj4f4n81kW7LD12DaCCVRXHSBScHe0Ky?= =?us-ascii?Q?P6VB75PYZAxBCToJLFkEweoEpuojEU4KX4LidNaf8Z2XAcNceM7Zs/oTXRhH?= =?us-ascii?Q?ZF2NIahneVjJ9QzrAEzOVAruEWuCr+G5a/Wyk7Hy8yR7aIvkZRh8/Bzf5lKM?= =?us-ascii?Q?mxKZQ/5+MH0TqCC5n84yzf+oLmmF1HKEW43DKHlGcmatgOcZmgeu2IpLwL+M?= =?us-ascii?Q?v4TVLNbm2D9A+Ha70ToW+GvZj9HMcwFl+XS4fmwf86EkyBhUfjCLPjFtLmVl?= =?us-ascii?Q?Qj9qCQvCO++Hgylgg9LjUOP61CLgvE3H4oNZweFipQXvt97UVYmD?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 9c433e0a-3b34-401b-c79e-08de5699289a X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:54:54.4844 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: os01Xk2e4nZ21Ey2wQputIQpTxuPGuzEvWQiMYVYOeMbuGRF+FzhbtKzUiUjrf4VS98hllDNKtYOFIFpjveXHg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" When a channel is configured to suppress host side interrupts (RIE=3D0), the host side driver cannot rely on IRQ-driven progress. Add an optional polling path for such channels. Polling is only enabled for channels where dw_edma_chan_ignore_irq() is true. Signed-off-by: Koichiro Den --- drivers/dma/dw-edma/dw-edma-core.c | 98 ++++++++++++++++++++++++------ drivers/dma/dw-edma/dw-edma-core.h | 4 ++ 2 files changed, 85 insertions(+), 17 deletions(-) diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-ed= ma-core.c index 059b3996d383..696b9f3ea378 100644 --- a/drivers/dma/dw-edma/dw-edma-core.c +++ b/drivers/dma/dw-edma/dw-edma-core.c @@ -308,23 +308,6 @@ static int dw_edma_device_terminate_all(struct dma_cha= n *dchan) return err; } =20 -static void dw_edma_device_issue_pending(struct dma_chan *dchan) -{ - struct dw_edma_chan *chan =3D dchan2dw_edma_chan(dchan); - unsigned long flags; - - if (!chan->configured) - return; - - spin_lock_irqsave(&chan->vc.lock, flags); - if (vchan_issue_pending(&chan->vc) && chan->request =3D=3D EDMA_REQ_NONE = && - chan->status =3D=3D EDMA_ST_IDLE) { - chan->status =3D EDMA_ST_BUSY; - dw_edma_start_transfer(chan); - } - spin_unlock_irqrestore(&chan->vc.lock, flags); -} - static enum dma_status dw_edma_device_tx_status(struct dma_chan *dchan, dma_cookie_t cookie, struct dma_tx_state *txstate) @@ -710,6 +693,69 @@ static irqreturn_t dw_edma_interrupt_common(int irq, v= oid *data) return ret; } =20 +static void dw_edma_done_arm(struct dw_edma_chan *chan) +{ + if (!dw_edma_chan_ignore_irq(&chan->vc.chan)) + /* no need to arm since it's not to be ignored */ + return; + + queue_delayed_work(system_wq, &chan->poll_work, 1); +} + +static void dw_edma_chan_poll_done(struct dma_chan *dchan) +{ + struct dw_edma_chan *chan =3D dchan2dw_edma_chan(dchan); + enum dma_status st; + + if (!dw_edma_chan_ignore_irq(dchan)) + /* no need to poll since it's not to be ignored */ + return; + + guard(spinlock_irqsave)(&chan->poll_lock); + + if (chan->status !=3D EDMA_ST_BUSY) + return; + + st =3D dw_edma_core_ch_status(chan); + + switch (st) { + case DMA_COMPLETE: + dw_edma_done_interrupt(chan); + if (chan->status =3D=3D EDMA_ST_BUSY) + dw_edma_done_arm(chan); + break; + case DMA_IN_PROGRESS: + dw_edma_done_arm(chan); + break; + case DMA_ERROR: + dw_edma_abort_interrupt(chan); + break; + default: + break; + } +} + +static void dw_edma_device_issue_pending(struct dma_chan *dchan) +{ + struct dw_edma_chan *chan =3D dchan2dw_edma_chan(dchan); + unsigned long flags; + + if (!chan->configured) + return; + + dw_edma_chan_poll_done(dchan); + + spin_lock_irqsave(&chan->vc.lock, flags); + if (vchan_issue_pending(&chan->vc) && chan->request =3D=3D EDMA_REQ_NONE = && + chan->status =3D=3D EDMA_ST_IDLE) { + chan->status =3D EDMA_ST_BUSY; + dw_edma_start_transfer(chan); + } else { + dw_edma_done_arm(chan); + } + spin_unlock_irqrestore(&chan->vc.lock, flags); +} + static int dw_edma_alloc_chan_resources(struct dma_chan *dchan) { struct dw_edma_chan *chan =3D dchan2dw_edma_chan(dchan); @@ -1063,6 +1109,19 @@ int dw_edma_remove(struct dw_edma_chip *chip) } EXPORT_SYMBOL_GPL(dw_edma_remove); =20 +static void dw_edma_poll_work(struct work_struct *work) +{ + struct delayed_work *dwork =3D to_delayed_work(work); + struct dw_edma_chan *chan =3D + container_of(dwork, struct dw_edma_chan, poll_work); + struct dma_chan *dchan =3D &chan->vc.chan; + + if (!chan->configured) + return; + + dw_edma_chan_poll_done(dchan); +} + int dw_edma_chan_irq_config(struct dma_chan *dchan, enum dw_edma_ch_irq_mode mode) { @@ -1090,6 +1149,11 @@ int dw_edma_chan_irq_config(struct dma_chan *dchan, str_write_read(chan->dir =3D=3D EDMA_DIR_WRITE), chan->id, mode); =20 + if (dw_edma_chan_ignore_irq(&chan->vc.chan)) { + spin_lock_init(&chan->poll_lock); + INIT_DELAYED_WORK(&chan->poll_work, dw_edma_poll_work); + } + return 0; } EXPORT_SYMBOL_GPL(dw_edma_chan_irq_config); diff --git a/drivers/dma/dw-edma/dw-edma-core.h b/drivers/dma/dw-edma/dw-ed= ma-core.h index 8458d676551a..11fe4532f0bf 100644 --- a/drivers/dma/dw-edma/dw-edma-core.h +++ b/drivers/dma/dw-edma/dw-edma-core.h @@ -11,6 +11,7 @@ =20 #include #include +#include =20 #include "../virt-dma.h" =20 @@ -83,6 +84,9 @@ struct dw_edma_chan { =20 enum dw_edma_ch_irq_mode irq_mode; =20 + struct delayed_work poll_work; + spinlock_t poll_lock; + enum dw_edma_request request; enum dw_edma_status status; u8 configured; --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020076.outbound.protection.outlook.com [52.101.229.76]) (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 B336133344A; Sun, 18 Jan 2026 13:55:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.76 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744511; cv=fail; b=Rnxot3h9QWjp35UKE5GfuRZ/ufyiG82GZigdqmqnghWDdQJ6Dy0GgnEMjFjHAOeJR0BXVKy9ViX/Z5NEAd8O1GnGmSSiB09Pg5fTp6deZ8DRDCNR6dOpojTqm5CZ50ymY9AGaZ694aS3+keWLb/RdfdY8QFM0P8kk56EcvFGg3Y= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744511; c=relaxed/simple; bh=02yU1iirFBdmkkdC2a40SpIINzbunfoPIelspJGz/Ms=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Y3H++ZQAq+ibPxpaVdouWILEHrXp5s8NxE3Hba7VlkVAqoDiVe1AMzYYEro3OiV8s3Eu1NjJ6WMh2MFcNqn8DCZ0kksXDYvf+ffenhTisAqnk6SoaftLumq4f40zsL96pGtlpAfNBnMyOzBi2W0GTf17B8pNNETzUpD/eyKwydg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=Vel3oa2V; arc=fail smtp.client-ip=52.101.229.76 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="Vel3oa2V" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OU4I1S2z0sA96BkM3Bf5CDqgZdW99Z0gtIM2BwPfPAB/8YsEu+ciYh2aZULmf/+39+9PmeYrvDTQnkhnzvHG630Bu+ZK4yHmAVutiyw8m8f/ENmRqU6Z8V8jQ20bsjp0z4ZIkstcZ/O3IToDaso8iOH5SZEiD1wEVH09Kc5pHTDSN8/OMpvXeCiZqLweajsCiKkQqrJDzNN6cczqm1v5uH0TOSi6VT1X485GwKoAXNCrUMvuZbahLwewww43YQ69sWGlKB2jHflsA1iFpOqrphnk5HKRmIxMdEcLcLavHRk3rseqNsPbeeJ07oxVHtnfIjRt7/KnETN09s4uUmXVrA== 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=Ka2n4UdZ4tW6wcwTwTrw24yknp1NSshf+yqmqy77S18=; b=F1LBbj7So5KjImV6PIEcUNPJ951rFICBgF3nhWlRd4FlZL/TzKGXgH6OB4KR/9nMbzebKpKrUilDO26teIFX10E4IHlJQBhIyBjCgzJydWd60fRxycWafQvW40M40Rpr+HDBCmYRgwKIzRBe3LZ0CrrFyOfsIhkReLjtbchzAflSnQiPZtiHp5ydP/YPAmPsInAj5wl0ZvYPnCQx1bctG/WMrG+GJPlOfkmCPk0eI+JCGmZQ834FoFopatosSCdzSQcRd+K5f9RcxfV+RUBmfLE/3OL4GPEd5rEHdikXQfonplGDmelsNeFRdE+coRk+dyvIOeXJKA4VeqDy1L9cSg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Ka2n4UdZ4tW6wcwTwTrw24yknp1NSshf+yqmqy77S18=; b=Vel3oa2VdZG6NxYZHbdjCCZ6CMZc1tJZo8iIAI3ih717w7iaRuK2cmNWTyPNz2v6qfZ3TvMTwxuEjQLtyGMY65aLzovI8g+B4EmnciV4m7O3fcMe9fb3v3lsXMBhIq8ox9TeHrF9LXdnVg/5P1npZagXkTHJ3p5lA4SGYcbqL8A= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:54:55 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:54:55 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 04/38] dmaengine: dw-edma: Add notify-only channels support Date: Sun, 18 Jan 2026 22:54:06 +0900 Message-ID: <20260118135440.1958279-5-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCPR01CA0184.jpnprd01.prod.outlook.com (2603:1096:400:2b0::13) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 1cc938a6-0001-4643-1408-08de5699290e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?dtULEGzxV1eqGxWmURv9UnFTi7+wUuhDTa3bohNs7q0Szvk2aKUh8OxKCsuJ?= =?us-ascii?Q?OfUheuP5bwNQ9TOVdYtbynvYVK/A0xZhMbRakt7MyxGFaipqaHne4oDhl0Yq?= =?us-ascii?Q?fAaovbtzGPSnwV1W4V+8zzV4t6pmF1Y5/cXL1n5nSVUBn6stBdrQ2Pvw/DaA?= =?us-ascii?Q?kB3xpcD4Vv0bKUBttX4iIQ6dYuYZ0n3zzdY1xOZ1nowrfXusdSZ5ZWGBJtOx?= =?us-ascii?Q?Ch8aG0a22nHShvEDg3wfdVdBnekWWiUtDHVNCNXHHUZ2wUAySI3etOkf8ZUl?= =?us-ascii?Q?7K4FNwusLu8zzl5BWlNtp90FMMIqglKVzmaO6aRQedfZ/nckOowvg5CQSZPo?= =?us-ascii?Q?iss08fH7NPRfPUEfO12NnQ7jp6+EtW900Nb7qUnuBy0yv9TqALnl7UCPaV0m?= =?us-ascii?Q?2a3WGCqzPBaJZHjY5KKy1XKA4+lqpXHA7nrzVGZjFmgC1tEuILnS+DIvYNhg?= =?us-ascii?Q?a/x4hFopbciDS7yPGsi6W8JNDv0a7iRte4ETS75llytcA94S+mwyYQ8uWG6S?= =?us-ascii?Q?wGxO6F6cGgKHF7TsDHKHj3SIR4ZL/sQie71nPwS14ZphYJu0ysn4GVpBhn5Z?= =?us-ascii?Q?ELN4zOphNvGpcha2+mlt5YGpZLaAj5BXloEKSCIijETlMpoMlq1/Hc7jZFsF?= =?us-ascii?Q?3L/Nb5XG2YhwzmwIT7bRsGozHiI8GEZXOZV7NNrzQghBuRdDiAtQ2GGuXGTE?= =?us-ascii?Q?9/3p/RbcskRg6myqTWncC0oaOr8hjNyqWeMrhrsKLrGd4lvFapM++/hhPi5Z?= =?us-ascii?Q?6t/wYGOjnClyM+VEuXGiD4HRJPtqwEm6i7moB3aazmPdMPSSSRiadM7r6kOo?= =?us-ascii?Q?DSoaekqM3656xwqdxUwuGv3SoN3zrCmmsTJaSD+V7tay48v+wLWWLNE5Ynja?= =?us-ascii?Q?xXjuzNhMaUOW3mGRkPMWBWQRKpV2hEO2F4Ucmuejvov3ox2RYcriS6wr4rJD?= =?us-ascii?Q?yUo1OGBRv/SkNFNZXRki/LlRUoy0TGmjuji07SdXtdnIHelYFiYezFqEt6LD?= =?us-ascii?Q?OQRno2gHNd9hA66VAUb0/o5DhLkCL9sFoeT8GoWwyHq7lNPCLlQzcWvtOs/t?= =?us-ascii?Q?/4erOo7jASvZmKjRFw/LaoDkYINiEJ4pMFJnIyEHq4eSJv3fdF5JBPAzbu8i?= =?us-ascii?Q?JkVYX1t7x5uMdlWaD7TF3i5Rq4ihY9PRtpl3QhX/F7uJ9mXtSvKYTFarCoPB?= =?us-ascii?Q?rUHGT+xuY3qC+iihZ8bibi2TKj9n362bl+oEyJvLG//wJsZBNGgkIHpZCVgz?= =?us-ascii?Q?KdOlBi092/Yfy4clF/N3F3w1GTfRuYIDJNZD4cq5TkLaBxcTiawMqix5oGmn?= =?us-ascii?Q?H06knAfJ0YA/RNALKVELD4ruusYNPVr2jW00qvNCerOOt82Nx5SgVqV4HWum?= =?us-ascii?Q?jbdgm4fKsGGStB/tVjtwH8xxRlR7LSXQAn2GQ0K7k7M21O4TVDKCW9zSfI9d?= =?us-ascii?Q?IbePdGjYiLAQ8uNYrZh03lT3F9UBUB46f092WwJDd1zvBgAb191tWhDdXTo9?= =?us-ascii?Q?OwzF3m7qLXO24LHdPajl7OL7tHCcKf02V+K8VIjwdR0JNfye+5m3KTG/ks5Y?= =?us-ascii?Q?8Dk4K61PehnXaPkzm+Ut5ayWxHc0gjzkzn+V2eo7FCW2YJbLCVgrjXEvOJ6z?= =?us-ascii?Q?0w=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?YkmnF4piaJMnCGGZkvgV/H5zDAom7KFytvMbjp6yBA81PmhJDnM4bN1Xxnf+?= =?us-ascii?Q?CWSYMTVVfYHA2oNi4/5iqYO0QYSar3vmlQ+dl3agTUr0c1hQKMAnxbF1g6/j?= =?us-ascii?Q?elqVIirwhb/Gsh7O5vxGZlCd8LAqZco2OKpV5xE1qW8OS8j1/qgznXHJSKc4?= =?us-ascii?Q?k4NrlAecRmVrDP5rCtoHajts4DF9CpEm9USkekY8cyQngyiCHMvlglcjE3Ym?= =?us-ascii?Q?nw8ALyrDEbH2MNSQ1bjpKPmwpYYR3aoYi7SYu7+aMmh3Fvk4NzBJTXlelF8T?= =?us-ascii?Q?+Jo2g0IJDpYgL84aBP+qQmAyUu4WMTUs3AeoMyGzAuKeXrpc7CwTP8GjD2+/?= =?us-ascii?Q?pnoBBQFFVtcVOXbWfL0O/zevW2SIJz7WjvTs07B9Nqy+hUpWF74XERVIGQpE?= =?us-ascii?Q?yb0oIttxH9YYYODJRJH4a8DLa0wyHSgjcKwL8nebSvXHC4jfQcHYBJ2Tv7Pa?= =?us-ascii?Q?NL8nFT839VqXE9dSmeM5lAp3lPpY7aHEzO4tw0P15ZphwQQ1mvI+8ZfUGV4w?= =?us-ascii?Q?XthG8mRhSEBFGk6hQrAepFxCOB9wV6mvpvXXk2o2KX8K6xkyr4YXIMDZvLtB?= =?us-ascii?Q?aHVy/ZI/zVRrKH8YJBpmgHIc8HkrVIKr6+2gdVfnjc01gYiWDDdtUgkZGycV?= =?us-ascii?Q?m+B9rwEmkXwv9hCbkLgn1W9cljAzOQLlhON6VXZA4i+5dV+Ytlcmj3IEkxHc?= =?us-ascii?Q?iv7l7LJoei2z7p+PuU6vBT4J5vHcSx3TQu2fNTdbS4GWh1X9w/mo0k/iJCCs?= =?us-ascii?Q?1vAn8OwyNHZp43xRXHJFZrQXfDKu1fnXBLOKUlyYwevtFHQlvHWAEsEYFzIa?= =?us-ascii?Q?Irtqw1urw/7Fr3cmY5HkCBq53Gtbh6oVOY9VUJB8GbYpNU7HbkxOv1kt0A1q?= =?us-ascii?Q?6rxHn0wG80WcDvumbWtt4BwSE53EqRoqL+zjXdE3sz9+u5hLy8r1G5kmq0Fd?= =?us-ascii?Q?oVSlFfoLH/BHuYgq9W6ti+sb7C2jeXmWcFHKhktFewVWJlIMxWEN4xvEX3Im?= =?us-ascii?Q?83qN7+k+Q6EPJSkV58AHDQtJAlbvyw75sS/JGMLvivd/6LJ2rkeBfrgbSxTs?= =?us-ascii?Q?EQfgDKJYrwrISDQztS8bUTuD+GslOFmiJprsGBGjdkqmiH6cUqjclc5sDkx/?= =?us-ascii?Q?bZo0MM7rR+drz2le6rbrdFHXAXZvZk+0aZBrAoNIlJhqYh1iamhyeMtuYnzP?= =?us-ascii?Q?n40zusFDUqoMtQ/7Y6645KoN65r+0jWoZCA/NHJM4ht+5N8okEzu997H6Wg0?= =?us-ascii?Q?UOWpDApXv54ea1ZvDBW1ipOh6teYQbNPiQj9PsCJt1mZ64mVW3cbIbBqWNZJ?= =?us-ascii?Q?r/cDrG08kswBWO5ebHaFlFqeWQ7fbkhnM9v0sLBYigeorUIBz5QJeCw0PLfa?= =?us-ascii?Q?jO2pjSaiKMq+Pq/4BKve+XkwhTkg5oBJPhrRIvt2V7PR+8dLQ6idEdxHfsIQ?= =?us-ascii?Q?k+6JSZ+810ExjXf6a1h+T3wscVt7x8cP7Hip4NKrLO+yAf/pe2md5F7wekfg?= =?us-ascii?Q?LC6GW3ww2tR5I0vIOuISTp4TjXGMDl0RshiJqinArLOrBaep7fr2fnAE/+kA?= =?us-ascii?Q?omrXDyH+TVKRdpzYqVIbHH6bVXaRPijqdpLfnKTOGayWa+W0xdR7hcSUw/PB?= =?us-ascii?Q?6wjOHdH/+cfp1GxyN8RV37xxjD2qs+6YJFJq8YP0vZXBBgIDF0wWwsj6HLnI?= =?us-ascii?Q?oIH2OqdQhX0kdTrkPP2y89d8QBJsu0WPm18kjmvi7mqK1GJTT3fow+cbADrO?= =?us-ascii?Q?Og4TUV245J4f3aWNYVnIG6wVzZwGY/YqPupMgTIwFyxea8tuS2In?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 1cc938a6-0001-4643-1408-08de5699290e X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:54:55.2334 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: UIpZeppzgK7dd3E1OeIdlmJLbmcc1/1AiBbA/pLXBUtUOJ35SKVRsEXiiI3MWVZNbLt5KGq21cy4sedbWd9hMQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" Remote eDMA users may want to prepare descriptors on the remote side while the local side only needs completion notifications (no cookie-based accounting). Provide a lightweight per-channel notification callback infrastructure. Signed-off-by: Koichiro Den --- drivers/dma/dw-edma/dw-edma-core.c | 31 ++++++++++++++++++++++++++++++ drivers/dma/dw-edma/dw-edma-core.h | 4 ++++ include/linux/dma/edma.h | 23 ++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-ed= ma-core.c index 696b9f3ea378..0eb8fc1dcc34 100644 --- a/drivers/dma/dw-edma/dw-edma-core.c +++ b/drivers/dma/dw-edma/dw-edma-core.c @@ -611,6 +611,13 @@ static void dw_edma_done_interrupt(struct dw_edma_chan= *chan) struct virt_dma_desc *vd; unsigned long flags; =20 + if (chan->notify_only) { + if (chan->notify_cb) + chan->notify_cb(&chan->vc.chan, chan->notify_cb_param); + /* no cookie on this side, just return */ + return; + } + spin_lock_irqsave(&chan->vc.lock, flags); vd =3D vchan_next_desc(&chan->vc); if (vd) { @@ -815,6 +822,9 @@ static int dw_edma_channel_setup(struct dw_edma *dw, u3= 2 wr_alloc, u32 rd_alloc) chan->request =3D EDMA_REQ_NONE; chan->status =3D EDMA_ST_IDLE; chan->irq_mode =3D DW_EDMA_CH_IRQ_DEFAULT; + chan->notify_cb =3D NULL; + chan->notify_cb_param =3D NULL; + chan->notify_only =3D false; =20 if (chan->dir =3D=3D EDMA_DIR_WRITE) chan->ll_max =3D (chip->ll_region_wr[chan->id].sz / EDMA_LL_SZ); @@ -1178,6 +1188,27 @@ bool dw_edma_chan_ignore_irq(struct dma_chan *dchan) } EXPORT_SYMBOL_GPL(dw_edma_chan_ignore_irq); =20 +int dw_edma_chan_register_notify(struct dma_chan *dchan, + void (*cb)(struct dma_chan *chan, void *user), + void *user) +{ + struct dw_edma_chan *chan; + + if (!dchan || !dchan->device) + return -ENODEV; + + chan =3D dchan2dw_edma_chan(dchan); + if (!chan) + return -ENODEV; + + chan->notify_cb =3D cb; + chan->notify_cb_param =3D user; + chan->notify_only =3D !!cb; + + return dw_edma_chan_irq_config(dchan, DW_EDMA_CH_IRQ_LOCAL); +} +EXPORT_SYMBOL_GPL(dw_edma_chan_register_notify); + MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("Synopsys DesignWare eDMA controller core driver"); MODULE_AUTHOR("Gustavo Pimentel "); diff --git a/drivers/dma/dw-edma/dw-edma-core.h b/drivers/dma/dw-edma/dw-ed= ma-core.h index 11fe4532f0bf..f652d2e38843 100644 --- a/drivers/dma/dw-edma/dw-edma-core.h +++ b/drivers/dma/dw-edma/dw-edma-core.h @@ -84,6 +84,10 @@ struct dw_edma_chan { =20 enum dw_edma_ch_irq_mode irq_mode; =20 + void (*notify_cb)(struct dma_chan *chan, void *user); + void *notify_cb_param; + bool notify_only; + struct delayed_work poll_work; spinlock_t poll_lock; =20 diff --git a/include/linux/dma/edma.h b/include/linux/dma/edma.h index 6f50165ac084..3c538246de07 100644 --- a/include/linux/dma/edma.h +++ b/include/linux/dma/edma.h @@ -138,6 +138,21 @@ int dw_edma_chan_irq_config(struct dma_chan *chan, * @chan: DMA channel obtained from dma_request_channel() */ bool dw_edma_chan_ignore_irq(struct dma_chan *chan); + +/** + * dw_edma_chan_register_notify - register local completion callback for a + * notification-only channel + * @chan: DMA channel obtained from dma_request_channel() + * @cb: callback invoked in hardirq context when LIE interrupt is raised + * @user: opaque pointer passed back to @cb + * + * Intended for channels where descriptors are prepared on the remote side= and + * the local side only wants completion notifications. This forces LOCAL m= ode + * so that the local side receives LIE interrupts. + */ +int dw_edma_chan_register_notify(struct dma_chan *chan, + void (*cb)(struct dma_chan *chan, void *user), + void *user); #else static inline int dw_edma_probe(struct dw_edma_chip *chip) { @@ -159,6 +174,14 @@ static inline bool dw_edma_chan_ignore_irq(struct dma_= chan *chan) { return false; } + +static inline int dw_edma_chan_register_notify(struct dma_chan *chan, + void (*cb)(struct dma_chan *chan, + void *user), + void *user) +{ + return -ENODEV; +} #endif /* CONFIG_DW_EDMA */ =20 struct pci_epc; --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021125.outbound.protection.outlook.com [52.101.125.125]) (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 74897332EBF; Sun, 18 Jan 2026 13:55:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.125 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744510; cv=fail; b=KxIs0S9/wGRIU7mcmmmSyVuM59RerJ2byjss4ASRJqmt7Usd2tnODF+GVd49zbIb/ET4W7uujrd5XDbL0XC2zq9uLGxE3cKdB12IElqZwk0eIESHCzCMw5Fv4S9cXA5PynlWGDpru3322PVVtbB/BHOFs6X20ONoZo2QfwXsXRQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744510; c=relaxed/simple; bh=a/zi6Ds54ieb3j0JNTggmcjp9C9wkNv8orPWEwfLHWQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=NrEcAbIrQTDfJcVOGav9YSDp6JECHqc2PDYbQEQBj02jfvzRL9bORL/kUaFgWYoS2VApA3IOfg1M4W8wHfk39/C1RiF/b/CFzM1s/lhsi9Jd9zlY3s7M9Qx67fyY12zSgU5zMsb2uM9NHFcdCsmx2t2c2m1D5XSB+JYcXxpxqRI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=tVv5t8Wi; arc=fail smtp.client-ip=52.101.125.125 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="tVv5t8Wi" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IzWk2R5u1mNwivIK8xSTColqiRY1RIYxNdgvc0/b9zCgPVh7033r2gBEshcqAs+7BSsZ2yZx/H7geHP6u/y5W7qUSmABYEluA3Qxe3scFQm4sJwY2N7lKwuasaasvy59VHR0k8tOcoY8ESTbP1vyEm+PQSeoECevUcWbzd+E7X+TP4a8HDQvU5QA6nse1cxdZnZnIFVSUOLWtaIKj0W6lvOmnjA4RvwAWh9Bj5zvsJigmLx0KlopNQJesPWPFqomC70obTDlyAdg+FS0Tlnvp8d4340qW+fZHcBzMrtCiJXiLI9RZ3LC9zOrFg39ZWUyrRzOOrKj+v2yu7aJGIrsXg== 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=wfhKDkTfysYYu20t6VYlSQ8jrEaA9ak7jaf4vV+c3c0=; b=Qz3xKn0xxmLfEuqiiGo4Nav2r1pER2D9btKSdp2R1FDSqTwd8iLW2ySsQ+xjt5Zbk89In0amBYwuE2yFu4W21khSapINp9e/WD3kxhiTQZOvbH76txsGUqWg+Arny/yBJKAvcXE3Xo/x5mxoCr0y2ZdII2i5PlGu6XF7ZJi8cPvavnTUdcB4jD/n7R4KD2w5BywI2VPH6mqliA2YNthUJ0/4zco5XuRsWJOBmDtFJT3Bm8Yokj01Q1Jz2F6qJ/dt00PDoO3O580frFbQAdRLFs5vKDh1ScjYhN6pqH7tAVI+rPFZh8VxV1LCm4KzsJ2Qw7Dj1FJOsI34eU5PI5kl3Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=wfhKDkTfysYYu20t6VYlSQ8jrEaA9ak7jaf4vV+c3c0=; b=tVv5t8Wi2thjmnVf9l59bju2pIaZ+1rH9oxyGYnLTpmX1K06wO5wWFsw1E7IKOXRMBYs5VDW7uXBQ+3BSaJoKtw9Z2kF1yDZzmqWE6UfKKzORRRsp5oL9j5BORcN/0kx4qN7RinhAi/ebidKaEq4w1mSUUEj8zmBNNF0oiQPrxU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:54:55 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:54:55 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 05/38] dmaengine: dw-edma: Add a helper to query linked-list region Date: Sun, 18 Jan 2026 22:54:07 +0900 Message-ID: <20260118135440.1958279-6-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYWPR01CA0024.jpnprd01.prod.outlook.com (2603:1096:400:aa::11) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: bb188734-c6e6-4330-4679-08de5699297a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?A8U8kGkJUuEB1g6skrrkprLW4MHG61xbVOgqoY1YQLqunH0O5WohINKsTQHY?= =?us-ascii?Q?Ghve2vY3ZTJQwWBMVoPAPj4PBVLnTDf357MSPGu1MKH9uAhVsUOarfNvne2D?= =?us-ascii?Q?90w32HMkir87YiDp4sJKmz3CuNnKWDkYz6E0tvGzWcRnel6U8DeSS300mlgk?= =?us-ascii?Q?VF86tLgRPoOBQ5UcqX6OVQ0j+H1ESZ7fGXQVPhBFwLUORSimHYEgumeCMLI/?= =?us-ascii?Q?QNnBe8YXgl4VAmeYRiCVZ6GcWeN0gAngFv3NoOu1FkFcp9RounAR9kZNeAlH?= =?us-ascii?Q?A/09KtoWEZLA+4c9FKf2n2SzYaHiKYZ4klxAenkgx4sQ7l7l55PetOLA9uxn?= =?us-ascii?Q?3OlVllB8y8EfOuc6z7w02Eb8vTssLL03QThCvpWG2wVk6lFp9Yg2fS6PxQjy?= =?us-ascii?Q?NH/owhgDY+HMn6m6ZolMuLEesttTM/6upPSu+R8DBSZi6jQYJBLJf8tfl6CX?= =?us-ascii?Q?dOFQLXtxNN0EKJgcZAXCV2b2lWQ51mYOc3cvMl71fRnPkMXWLTMZgK5ufX5W?= =?us-ascii?Q?olxbk9OwAd7ueAkrGmbmvmdqdRhbHTeGyNuT/jZqTtTYFPFNY6dcV62pnORR?= =?us-ascii?Q?1wOEDSQnIrBmmpfwiCjMzIKpY7eVxW391bILhZkLjh4E2152o0c/KX6q1/Qg?= =?us-ascii?Q?p22sK4ctN0F817hXP/jWm4ujTu8ulhuYOenq+F8KKgl7QCfktT5mlybViqCf?= =?us-ascii?Q?BUgokVW8nUQIdp67zLX4LMxds6CP/M1xSIta2xul+uVfeStrDsZc7qa/xRMM?= =?us-ascii?Q?rsNxwS0cAoio9bcw14KcLfwZvu40fJB4qQ5HmZhC/YAcGXqSsYZzHR9DZBEL?= =?us-ascii?Q?5yje4tu4LdB45hx06+YGFsw7eFUn4c9dRzdZJDLf6AFTw171BeZJTS47LReR?= =?us-ascii?Q?HlXaTnlbQKWaIo1Ut0v5Ad1AYMRF139bTWUFkE7mUauaZnZIHBhzjo8sFqnZ?= =?us-ascii?Q?LTfdzG9BO2ftwGw+7+erijjhTU7Mda2P15RDFHbgg6ROWWQ3kNvvJxO8Obb7?= =?us-ascii?Q?sQAB1uRsrOoBFmhq+R9Wjhv4MgnrRGo/xM77chkLoyAVgxD4zUt9Mo7hY56t?= =?us-ascii?Q?xvh8GbegSQB5SI5MvrLlr7XdgZtm+pHDih+HpYEOslVS9y463pYUuyXkgJAx?= =?us-ascii?Q?VCSHJJNeDCMejzWXSw3Y4Zdx0Rwx2dBXTy6M0wSU5ZmZ/BHHp7JoVkm07epF?= =?us-ascii?Q?313LBsk16Dr5SW2S28drR1/Zpheyzyl08742tmwTcvQaDzcpgXg5kLR8+CIV?= =?us-ascii?Q?hcbSMaB5lbmUkf98u0NfcPrIyugTZdKWeJmseBya4aJTriu6g6v+8AsZcCle?= =?us-ascii?Q?MNj7y1K+vy9I6iHkmaMUGAnunpMzuoFH+6LZjpYkLd1hWB475YerYZsJq1Qv?= =?us-ascii?Q?JXxVD6zl0JXswmDqSNx3p3MwuzrSx/pPveat+5RK6P7to+dfGlrYvAhFJy/l?= =?us-ascii?Q?O2ZP4pjRKxfVAb/6ObNoDpMA3mcF3rAZCC4BKVpfjiRiQVtGL9+4kNpf5D9r?= =?us-ascii?Q?WKe3uDS3A2zAi82f2kaGB4DVuW06LIGxDnkxdHF1yM388AtX6+KPsPk4ep9F?= =?us-ascii?Q?VaXf4V0KRsbT3+iVnOXrJ8SeOM3W/60l5GBB8McSc/eMulzzcvDM5GD4qGtP?= =?us-ascii?Q?Og=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?tK4Ms913m7AQTDVEjVkeM+/E0V0jY3Xkk3u8HMgGbmrMRvkevzJtgkof46oa?= =?us-ascii?Q?4Pddb9j0cPRNZLYXLXfsqrUZn0VEfsjxmtFjU9cvcGw3KL7wxA4GpUSEArrr?= =?us-ascii?Q?Sy/JqM+rrRavhrfTpqtyrI8pX81aniCXBkH54VcgVfENx7ilvEbaEESjo2qc?= =?us-ascii?Q?pbuJ5ZKnfDNoY084VxXejGPtxgjPYWPgZ9Cuq8ccDuAj20BwXMjHMR8IJ2g1?= =?us-ascii?Q?ZNmD39dS/kYCguPMk/LilTvaHnJEcGZP6MGoNNTK2CW8iD6/mt7bBvT+tUwr?= =?us-ascii?Q?l1vA9TvjX4OShTXW51+7Lh2a9luHpAu16cC+Uu5V0L3pa4/OR8Zj+FQj2IMQ?= =?us-ascii?Q?qHcVTDgw9px2pv/JQ/1KomYAin7K+uXchi4iDrEpEg3I6YzaWMKnNI1lKOBh?= =?us-ascii?Q?3gf6LQal7FR0NrYXVo3qu9IXtGEiAg5QuyxIqsmmNwbhqmZyevLVzwrBkgWy?= =?us-ascii?Q?PcAVPHmRvsczmIfeIIL/tJmHS9t9ihZfltoKsiKmkqiJ3buOgN9wxElrQKRD?= =?us-ascii?Q?UuM9FoxsqwI3YFZWFoze1gbQmY3P5Viq6vSUR4KqOiX889OXZEOxQoajuB6u?= =?us-ascii?Q?Fs/E86r9+2VKiy+jdzoKZaHOZ5vfbi60kuW+ZMV8sE9a7xaoVrC/y1qkUGiD?= =?us-ascii?Q?sp4ohMQpbK/eClD6bHS7AN9+z8xWl0bNgn74mcOY8B68GGqGxyL9cwlhG/o9?= =?us-ascii?Q?WmJf0Qqu3FdJ3PLEZXkCOeWjSCnPzozDhrEk+p2i9fm2YZcp87wDGMsSTlGl?= =?us-ascii?Q?sf9tF5gfl+lSA0YFy5OecE4+pP5zLvgVTwxpX+23gT9O6xa67uLwPHZWacj5?= =?us-ascii?Q?fCRX3mhnwuK4wQQfDU0tP83yj0vUBqNktrtqjBFkAjDNWBlWMytcJCvurd1H?= =?us-ascii?Q?WTi4GxeDl51toHvtCZSRY1hLqdHXt36r+AfCvIwqZoe68Hqp2O9EbZPUesM0?= =?us-ascii?Q?YGNWLxKcJMn88PH0yszOpq+nbgFJpSXzjYkY3PUNEm0QW8KADEf8hz0R6ued?= =?us-ascii?Q?9a1k0k5yuC1HErImXsQQ1gxgpwgMImDNQ6lGLdhLgTKQzvXlnDpSH5LemYtn?= =?us-ascii?Q?jQb7rxZ38QnYoUFFoasIESOdTYTSjIeA+Nk9RDOmaQfD7HUSZKbeyxi0u1S+?= =?us-ascii?Q?GRIgi3tRHUY0prsoX4Lk+OBYb8MT7bWykHuZv7QXuWek6UJly2UZTk7BXar7?= =?us-ascii?Q?nbP1fUvdDf+6/MVNArVei/GaKWlg7ojaa5jIqsVQ2N67MC5VEnogmZdnsqp1?= =?us-ascii?Q?yu40arqJbLTq/SlprSlHJoesJ0bWRTzwjpDKfidCsLQtrnVJ5oSzKesmbxFM?= =?us-ascii?Q?5iQnCqz8fIaykBThka61fAHH657oVu0F9vYHlYglCoqFxN9SdO+PUR3eIRf1?= =?us-ascii?Q?mL9iOSHIFluYeEO85vpRsOWSdKq3WiHkStVsIRGwj3oA2+s91BmthK6unEXW?= =?us-ascii?Q?ouZJajRfs22f6+lqS0ba7ymsxZ9yKls/r6UvGWgNN4+x82iE6Aqw4Xve4IVs?= =?us-ascii?Q?kxmM1OH0yhbnq/f8fxhHaQpD9DAyEpCZN5NzFazZM7g+YvhOc9gla6ycbPUx?= =?us-ascii?Q?YN/2DDlJdH/z33H3E6wK5l8G6sXGBx+kqzp2IKCQYRRnqXHq0BjyHCNAIkp2?= =?us-ascii?Q?qw0DU1AJLGQT3CHUPBNDwmp6hdquveia2PHrVsK980IooBvyxXFJS1FKqO3Z?= =?us-ascii?Q?FRaqfc6bpom8zIBJ8ISKtzPk0jtu83lOApV2UpCbz01Q/q4twRmLfhVlZJbc?= =?us-ascii?Q?NPO0c11D+l6p/akUBBa9xm0ewKEbprA3eFti7z/Jpn3riEHtXwZN?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: bb188734-c6e6-4330-4679-08de5699297a X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:54:55.9489 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: XzVvBGkcXSURXKFZhh+eCLMvWDEPsDxyI+kByuYgFv5554E/rKF0XGTKjE8Ql7gh9CG+3aBDNGYKmoLr8Glt9g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" A remote eDMA provider may need to expose the linked-list (LL) memory region that was configured by platform glue (typically at boot), so the peer (host) can map it and operate the remote view of the controller. Export dw_edma_chan_get_ll_region() to return the LL region associated with a given dma_chan. Signed-off-by: Koichiro Den --- drivers/dma/dw-edma/dw-edma-core.c | 26 ++++++++++++++++++++++++++ include/linux/dma/edma.h | 14 ++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-ed= ma-core.c index 0eb8fc1dcc34..c4fb66a9b5f5 100644 --- a/drivers/dma/dw-edma/dw-edma-core.c +++ b/drivers/dma/dw-edma/dw-edma-core.c @@ -1209,6 +1209,32 @@ int dw_edma_chan_register_notify(struct dma_chan *dc= han, } EXPORT_SYMBOL_GPL(dw_edma_chan_register_notify); =20 +int dw_edma_chan_get_ll_region(struct dma_chan *dchan, + struct dw_edma_region *region) +{ + struct dw_edma_chip *chip; + struct dw_edma_chan *chan; + + if (!dchan || !region || !dchan->device) + return -ENODEV; + + chan =3D dchan2dw_edma_chan(dchan); + if (!chan) + return -ENODEV; + + chip =3D chan->dw->chip; + if (!(chip->flags & DW_EDMA_CHIP_LOCAL)) + return -EINVAL; + + if (chan->dir =3D=3D EDMA_DIR_WRITE) + *region =3D chip->ll_region_wr[chan->id]; + else + *region =3D chip->ll_region_rd[chan->id]; + + return 0; +} +EXPORT_SYMBOL_GPL(dw_edma_chan_get_ll_region); + MODULE_LICENSE("GPL v2"); MODULE_DESCRIPTION("Synopsys DesignWare eDMA controller core driver"); MODULE_AUTHOR("Gustavo Pimentel "); diff --git a/include/linux/dma/edma.h b/include/linux/dma/edma.h index 3c538246de07..c9ec426e27ec 100644 --- a/include/linux/dma/edma.h +++ b/include/linux/dma/edma.h @@ -153,6 +153,14 @@ bool dw_edma_chan_ignore_irq(struct dma_chan *chan); int dw_edma_chan_register_notify(struct dma_chan *chan, void (*cb)(struct dma_chan *chan, void *user), void *user); + +/** + * dw_edma_chan_get_ll_region - get linked list (LL) memory for a dma_chan + * @chan: the target DMA channel + * @region: output parameter returning the corresponding LL region + */ +int dw_edma_chan_get_ll_region(struct dma_chan *chan, + struct dw_edma_region *region); #else static inline int dw_edma_probe(struct dw_edma_chip *chip) { @@ -182,6 +190,12 @@ static inline int dw_edma_chan_register_notify(struct = dma_chan *chan, { return -ENODEV; } + +static inline int dw_edma_chan_get_ll_region(struct dma_chan *chan, + struct dw_edma_region *region) +{ + return -EINVAL; +} #endif /* CONFIG_DW_EDMA */ =20 struct pci_epc; --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021073.outbound.protection.outlook.com [40.107.74.73]) (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 B273C333446; Sun, 18 Jan 2026 13:55:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.73 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744511; cv=fail; b=lzR3xcMcJQjQx8JEyXp8pfySJutV03N9zp+wiLzdcUoZR2sVjypQxAbFvZaSdT8sXh/UbVCPO5yXLlDmLLJg+XGc090O9bgIugY7OhaPhSt0IZqXgQdYZfcz7yJTbB7EMIQ4ZNul+nug1bzcH61TWncubo8F2SB4lrn4gwMTtWc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744511; c=relaxed/simple; bh=b1K8f+FMvWvyKaEwtDwI041WJZhofscubDyK1pCjKWE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=G82+tQs3dQcsNvHJ0KnhGthj9Ffby36sl8UlybQmFnKRkAeO5a/mAdbO++t8sBneHPy4x0RvsLmO0Etnmcl5z83RUHueAp/CJ607xlExqs4jlHOucigLTkLZbBKJ9Mkrgufo3diEplasgtGIblULbRcIBOMnrRs6VfayJORwbGg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=V7/Qfzpb; arc=fail smtp.client-ip=40.107.74.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="V7/Qfzpb" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=VynX5c1UFzuPuGHwmXtA6baaMFPitSElIhXLmheuzqnok8dV90LLcbrtiv6MPMeoEJlDWaPj8EXSz5mUqK+amLn2kIU89fmZHK1VB8eiztyRzw5dX6rDOjuTUIR/jI1XXChBlGqZh0ups/wkUuqv+aR3dxzWgoIwxwPZQ8btSuFuZjAaURaBpHtfYs8gn8OHhdsXUn55FQobYTXZJ88b+z1h95bsyqZ60KoGkLuOIjlVvOmZGDAnOQVD5EVWTr8D8IY+KcTXg1opWiArqRRn3vAHJyc7TBZZ3kQ+vxm/OBpnlIV5pYdJm7xnC6dximbxZfmnKJGSb+FiB7Dg8HQ3eQ== 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=ObZcERkw/MjdNVvN5gPzrfGDocZ6MdRczoTNp/+qqr0=; b=xX7aIj8of3XP1YCBl3VQCt4iaVr+0AawJbI1xq1xvOjEO+vczMe1ldsvkHRD/z9xKG2Ia317EgoiwaSL0YBdZbpZ//tBkcYV4qn0Qv+AKbKT8l/C28zMwUc+Ww0vRrt1+MjIjBzkPGqKrcseVvvxL7a+bvm803JTgmkLg9XGlf3qSw6ovJqB3I6YsvtYbcR8Uo/NsXfEI4373a9Lh6Qn4SQlJStn7lTMvIxp0OLcO0uYUK6rhJKPPyhhPWcXkPdNnFkV+5XqNZK1F1Qv5e1rk/XPmPCOp5iUPQ73Y+6yPolOlv14Yqo3cwJowbsrT4y6hGLePXuEesDA6iBBLq3c/w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ObZcERkw/MjdNVvN5gPzrfGDocZ6MdRczoTNp/+qqr0=; b=V7/Qfzpbk9xCUdLrhehfmHUEw7D+AXprAmHfI3vIQ7Am31MEQ5E2Fem1lbwPPi6D8AfSuBOAwPLKH0HptFKEvIAHw5db/EHMh0ZU6x+A+JgPFzxkUBz9BJeL0ZR2IzijMbfx/Iyoz8sQDVRYSI9/RXH5qVZnh8dvpAuf5SqkHl0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:54:56 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:54:56 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 06/38] NTB: epf: Add mwN_offset support and config region versioning Date: Sun, 18 Jan 2026 22:54:08 +0900 Message-ID: <20260118135440.1958279-7-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P301CA0087.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:37a::6) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: d22ad279-bc36-461a-fe06-08de569929fb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?+FGdxc4ub5LJCHmpaAnbBFeOq7dREexz+0ttfAWTuLkLcVecwHmkv8KtF82G?= =?us-ascii?Q?J2whHSSViY1W0CNr9m4XX2GVJzgGT4ZO+q691YADfHXoxSi/Cg37EaU8cWWi?= =?us-ascii?Q?IQXHlvB/0HSlU+tdzief5Vxdz3ZdmmjnkOgAr8N8BOqYnwjKpZuKEcwew1On?= =?us-ascii?Q?6FbPqE5SQyHyaabccRp2nbLmDnKqpP0DhHmK+Gbhy7wDpGhtGpAcLpO0rSAs?= =?us-ascii?Q?3LSOoKklDviFP6d3xkBlDiBIavkTIk1XGeOunofxp0TO6AfEY+1I/1lRLMMr?= =?us-ascii?Q?aN56plQJMQ/SwDEWE/xNNn7Yr2QMizk8Ooh7BJ28OKctykPlPCXA/+fJc9KG?= =?us-ascii?Q?f4SfU8C0UhOStz1i0rltIdIclafq1SWa7KB3MMvBDY0vCOlNEOsCLUOvUf94?= =?us-ascii?Q?WErddQc7A4j+q9lpynDXoEu+y0+D9GUi+PNbMMdvvt/PE/Q8oWOCR7UVdYI+?= =?us-ascii?Q?dHZ0KswwE7Ie8HFF5EOfSa1AXzHB2Q4H9ZZvDZ1/PwnzzboBQJ9/yaWNYI17?= =?us-ascii?Q?IcnZwcZrxrQlavsoFJoFzUQvXzDqcZNAR2Yfnz/JTOJsPOwThqTQy5O+3Nqe?= =?us-ascii?Q?h6kQ86gLn4qXu4jLT/Va1uIHkJdinx/baLtnCzP07sfcGWBlx0gB2tSb9SVz?= =?us-ascii?Q?GBicFOIEPjovCJtktrUKJpoz8fk+dfxBrr2UnuYYmHVqZ4aL1OvkuAuJtekb?= =?us-ascii?Q?1jS7TypPL8I0U99tPEW+8MuuTEbXWH2GZM9gPxMfnReE6A35eLa/YPiIa06h?= =?us-ascii?Q?yy9GI4ibGfln2Vc7hjLa2TfSvmHZsIY5Ra6zPokRa38RABx3eahVVkTBqIsW?= =?us-ascii?Q?ehW/vBEhX0D8/XfZjyZVrPfQm+KdnZJ8XV6E1vs+gH3OL+M4Q70BZfFj+TBv?= =?us-ascii?Q?UOqN1PysmujDNf63araCuLTih5Z0ts1c3c3r0+V2T+40xQQD0o4RH6OldHUm?= =?us-ascii?Q?Yg9Akew6NdFDvnRO7E7fcutZBFAv47hpMd1SaCKC8NI0+4zxERWNpZHpb/rA?= =?us-ascii?Q?MtS823dd7xv89AggtIyVPGdBqjun4pYSbuLiZn09Elj2S2lBnFO9DWcDSRYd?= =?us-ascii?Q?sMgiZg7H7gn6c4cTSE4DuVEr+Iw+0AdDaQcJcEhr3OAdF3SzCJ8aH8KITJ3m?= =?us-ascii?Q?PzIWO+SleNc0FrZ0pQH2XT/xVylBaq4SjpCJ4PHotwXyBIy0Ys1LHuZ9dEi5?= =?us-ascii?Q?PAC+THRbLF2brlZ1lY09gbS1Uf0xTyaRJkyvPzhahzGDhyQ6O7Yh+OS4FMrC?= =?us-ascii?Q?KtmZN9K2bCKo9rKhcbk4xhTTh9DqKcKehyS2ufEJ7OchNhcXDVtUpBOBFKr2?= =?us-ascii?Q?lazaQUtMdqD7cdGaEd1iR5d6ApTbPA2aqMyDrKkOjPLELid5tQb4gJ+IfN2n?= =?us-ascii?Q?rMKovlrbDg5zll0j8Ey3XOHG5vzEsTT9lZ4Q6VcsZbYFblSoOx3fQ6khfMcc?= =?us-ascii?Q?ftSbebyyzLraczr3Kw+SE9WZBP3Tkn6Nu1tZBvCmi1gPjEmq7N/ZOiV9L+uM?= =?us-ascii?Q?7W0GrfiPvDoBrAcuRym3FugzQJ7hOZkOW1s1n09hAgCnP0OcCShpfIeDVMMQ?= =?us-ascii?Q?JjQMOZVTZCiVeWUqi95ge52LW0Yj13GiK1gX34shOwIiLtLA52qWuli4yky5?= =?us-ascii?Q?EA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?FBWFTVmq978tkUfb/r1U9OCdoZBUv9ZV1EEZUHXNCLmYaDQCjBliJ+Uu9Byd?= =?us-ascii?Q?caAXeHnSYYGPBnxfnkcjg5jrC3CVJj84TlkQasbh6yQHk4Vm3DoF1YC3hADN?= =?us-ascii?Q?ZkswmE+JR0zkXgdgSsKxEhYEREH2vHa0o8HWIe1oXLnqFcNj3Gv1giqOzjbO?= =?us-ascii?Q?r7XO5jU1opa87/qeuRUWogB8rfEfeIdnveEuJ62bT5AC3woNJu4OQ05IOsJR?= =?us-ascii?Q?HPcjnVVT0XcJ2vK1fB0KlXYtSJaKlGtCbSjJ/h4+hooLQeUIk0E32QrHPMvi?= =?us-ascii?Q?dgjDVgR2qndIjRJMdVIIrP0Bp7FfGnrmy1Uc1Wo3P6r5XWVBj9xhPhTu1EWm?= =?us-ascii?Q?M5cv+TIfjgRikkEmZRFiRXNOCknIbJw8+ELz6BQWszZeC3KtgTE3fXJxgAN2?= =?us-ascii?Q?Dq6Q2MWNe+dqrH4aFIvW5Gb4mhWMDLgSiTZtIQFTVlfngjsHfqdxo/757nhS?= =?us-ascii?Q?ISYU8+BFhjbzdBvBkuHMKlPxpaCRmAELz/MCIDYVG6AbojVdq7IEnuenO8hB?= =?us-ascii?Q?SzMZG32MjyQIch3B7tO+liQ6imBUpBkXZv1hAAjqOFdAvtPpivK5e8WDvwNh?= =?us-ascii?Q?GA7jaELjnShYumEdxLJDZYX0q7bNBGmLvf8Oq4gDi5Z0iXnFyfQ0lq49CRXl?= =?us-ascii?Q?+EcC2REyEliJTDYDA+uNsTR5xWhptyuPF7JnPEzyCv4LC0118zJskQpAf6hV?= =?us-ascii?Q?EmiIj7VFxjrl0LBqLbTnUf9trno1tCvgjLYQWjCSI7pFH4hdBsCCKIKEopbd?= =?us-ascii?Q?kLQ0luMXCT5CWPCijmlUekxbgg2c3SPBiAQMw3CAb+u3MP3MfIn94RnpSNvu?= =?us-ascii?Q?k91ElAW/UcdHAFnF6RTHWm1u+Hlte64MIhT3mQ3sMg4XEza98Nd0RDJo5Tv3?= =?us-ascii?Q?CBCNYvm0nMwDzCE0maKOMCrH6xBV9+goOAI0+T3p0RBU95i4hDIctFwV77sM?= =?us-ascii?Q?QhhLy7IRuCLZg86qURn+Rf/lVz6ULv8VrP5MtizfW1RQEXDjVxrRv8RK4VVu?= =?us-ascii?Q?O8GQr3dF5oN9razv9or5BosbxdLqEt6eI4Yv6jw+VRCd2XoWcbAfDEhcHRtQ?= =?us-ascii?Q?f5+Ns9v4+wF3Z9fPGIaglugSl4J388Kb3YHY/b5L4doFaW8XPautRU0zn8iw?= =?us-ascii?Q?CFFZ28XFMhSOlJaRder1d2NFFCWTUPV7GDHVtt6kwi08eg5MbuniczXFzkqU?= =?us-ascii?Q?/X2ZlYXAgVMYMdMrQg+jJ/21hySohLwh0Aab+chO/anhreJV1aAr7NAHFjRc?= =?us-ascii?Q?xnr9+NuyzMTkzZKzv8q46qArGjHvEecwYqPvm5znyn6NF9Lkq+rKE11VNfek?= =?us-ascii?Q?XF37GeF63hoCVuhXBoHPbfc3FtE2U2mYbLItiQhbE2hEQhIcgp2PVOQEoMih?= =?us-ascii?Q?+IC9nshyuzmCJSogSh+oP4E9iLNBNt74PnYJKiG3E653xQBgnaxwKw0Krhr+?= =?us-ascii?Q?hAiwYIsY9HZtekpQ0JR1nDkoLcl9fqNSi+raxdq9hU+AzDXqkOf/4effXF0t?= =?us-ascii?Q?e+0P97vWk0HWHE7QBKbj4N7/+Tc3MP0bZ2XVuFVqfnpLAsm4HYYkgwL0MpSq?= =?us-ascii?Q?aR1Gqg8DFnMVRBC1ciP64s9FZrx9CckTPQTYdKhvnlgXIUUpryyyGkB3naVa?= =?us-ascii?Q?JpjYvMQfqJHAexh2jkDC6U4DzK+aHdy4Q4nHrz3Aqr2JiQw6pkZ2wAi0cw9M?= =?us-ascii?Q?PwYozw+7fy/8SG4anQEmggRLVVPFn0IAsfsxn6PFhKh/pu6Xd4ogO7aEo7Lq?= =?us-ascii?Q?mkCELETEy03hEzcanqpc/hbDA4b0V49nLifNEPfIwt+PpIQfw86T?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: d22ad279-bc36-461a-fe06-08de569929fb X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:54:56.8004 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: o9XKnCbk4juZkJbtBTJ4L5y9v51vry/yNk2NJQcYGuRD0/RSe9eTSYPaki9f1EvkQOfs7WRwQkao1dJK8m6sZg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" Introduce new mwN_offset configfs attributes to specify memory window offsets. This enables mapping multiple windows into a single BAR at arbitrary offsets, improving layout flexibility. Extend the control register region and add a 32-bit config version field. Reuse the unused NTB_EPF_TOPOLOGY offset (0x0C) for a version field. The endpoint function driver writes 1 (NTB_EPF_CTRL_VERSION_V1), and ntb_hw_epf reads it at probe time and refuses to bind to unknown versions. Compatibility matrix: | EP v1 | EP legacy ----------+-------+---------- RC v1 | v1 | legacy RC legacy | ? (*) | legacy (*) An unpatched (legacy) RC may misinterpret the paired EP's intention and program MW layout incorrectly when offsets are used. Signed-off-by: Koichiro Den --- drivers/ntb/hw/epf/ntb_hw_epf.c | 60 +++++++- drivers/pci/endpoint/functions/pci-epf-vntb.c | 136 ++++++++++++++++-- 2 files changed, 176 insertions(+), 20 deletions(-) diff --git a/drivers/ntb/hw/epf/ntb_hw_epf.c b/drivers/ntb/hw/epf/ntb_hw_ep= f.c index 9935da48a52e..4b3fa996219a 100644 --- a/drivers/ntb/hw/epf/ntb_hw_epf.c +++ b/drivers/ntb/hw/epf/ntb_hw_epf.c @@ -30,18 +30,27 @@ #define NTB_EPF_LINK_STATUS 0x0A #define LINK_STATUS_UP BIT(0) =20 -#define NTB_EPF_TOPOLOGY 0x0C +/* + * Legacy unused NTB_EPF_TOPOLOGY (0x0c) is repurposed as a control version + * field + */ +#define NTB_EPF_CTRL_VERSION 0x0C #define NTB_EPF_LOWER_ADDR 0x10 #define NTB_EPF_UPPER_ADDR 0x14 #define NTB_EPF_LOWER_SIZE 0x18 #define NTB_EPF_UPPER_SIZE 0x1C #define NTB_EPF_MW_COUNT 0x20 -#define NTB_EPF_MW1_OFFSET 0x24 +#define NTB_EPF_MW1_OFFSET 0x24 /* used by legacy (version=3D0) only */ #define NTB_EPF_SPAD_OFFSET 0x28 #define NTB_EPF_SPAD_COUNT 0x2C #define NTB_EPF_DB_ENTRY_SIZE 0x30 #define NTB_EPF_DB_DATA(n) (0x34 + (n) * 4) #define NTB_EPF_DB_OFFSET(n) (0xB4 + (n) * 4) +#define NTB_EPF_MW_OFFSET(n) (0x134 + (n) * 4) +#define NTB_EPF_MW_SIZE(n) (0x144 + (n) * 4) + +#define NTB_EPF_CTRL_VERSION_LEGACY 0 +#define NTB_EPF_CTRL_VERSION_V1 1 =20 #define NTB_EPF_MIN_DB_COUNT 3 #define NTB_EPF_MAX_DB_COUNT 31 @@ -451,11 +460,22 @@ static int ntb_epf_peer_mw_get_addr(struct ntb_dev *n= tb, int idx, phys_addr_t *base, resource_size_t *size) { struct ntb_epf_dev *ndev =3D ntb_ndev(ntb); - u32 offset =3D 0; + resource_size_t bar_sz; + u32 offset, sz, ver; int bar; =20 - if (idx =3D=3D 0) - offset =3D readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET); + ver =3D readl(ndev->ctrl_reg + NTB_EPF_CTRL_VERSION); + if (ver =3D=3D NTB_EPF_CTRL_VERSION_LEGACY) { + /* Legacy layout: only MW1 offset exists, and there is no MW_SIZE[] */ + if (idx =3D=3D 0) + offset =3D readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET); + else + offset =3D 0; + sz =3D 0; + } else { + offset =3D readl(ndev->ctrl_reg + NTB_EPF_MW_OFFSET(idx)); + sz =3D readl(ndev->ctrl_reg + NTB_EPF_MW_SIZE(idx)); + } =20 bar =3D ntb_epf_mw_to_bar(ndev, idx); if (bar < 0) @@ -464,8 +484,11 @@ static int ntb_epf_peer_mw_get_addr(struct ntb_dev *nt= b, int idx, if (base) *base =3D pci_resource_start(ndev->ntb.pdev, bar) + offset; =20 - if (size) - *size =3D pci_resource_len(ndev->ntb.pdev, bar) - offset; + if (size) { + bar_sz =3D pci_resource_len(ndev->ntb.pdev, bar); + *size =3D sz ? min_t(resource_size_t, sz, bar_sz - offset) + : (bar_sz > offset ? bar_sz - offset : 0); + } =20 return 0; } @@ -547,6 +570,25 @@ static inline void ntb_epf_init_struct(struct ntb_epf_= dev *ndev, ndev->ntb.ops =3D &ntb_epf_ops; } =20 +static int ntb_epf_check_version(struct ntb_epf_dev *ndev) +{ + struct device *dev =3D ndev->dev; + u32 ver; + + ver =3D readl(ndev->ctrl_reg + NTB_EPF_CTRL_VERSION); + + switch (ver) { + case NTB_EPF_CTRL_VERSION_LEGACY: + case NTB_EPF_CTRL_VERSION_V1: + break; + default: + dev_err(dev, "Unsupported NTB EPF version %u\n", ver); + return -EINVAL; + } + + return 0; +} + static int ntb_epf_init_dev(struct ntb_epf_dev *ndev) { struct device *dev =3D ndev->dev; @@ -696,6 +738,10 @@ static int ntb_epf_pci_probe(struct pci_dev *pdev, return ret; } =20 + ret =3D ntb_epf_check_version(ndev); + if (ret) + return ret; + ret =3D ntb_epf_init_dev(ndev); if (ret) { dev_err(dev, "Failed to init device\n"); diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/en= dpoint/functions/pci-epf-vntb.c index c08d349db350..4927faa28255 100644 --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include =20 @@ -61,6 +62,7 @@ static struct workqueue_struct *kpcintb_workqueue; =20 #define LINK_STATUS_UP BIT(0) =20 +#define CTRL_VERSION 1 #define SPAD_COUNT 64 #define DB_COUNT 4 #define NTB_MW_OFFSET 2 @@ -107,7 +109,7 @@ struct epf_ntb_ctrl { u32 argument; u16 command_status; u16 link_status; - u32 topology; + u32 version; u64 addr; u64 size; u32 num_mws; @@ -117,6 +119,8 @@ struct epf_ntb_ctrl { u32 db_entry_size; u32 db_data[MAX_DB_COUNT]; u32 db_offset[MAX_DB_COUNT]; + u32 mw_offset[MAX_MW]; + u32 mw_size[MAX_MW]; } __packed; =20 struct epf_ntb { @@ -128,6 +132,7 @@ struct epf_ntb { u32 db_count; u32 spad_count; u64 mws_size[MAX_MW]; + u64 mws_offset[MAX_MW]; atomic64_t db; u32 vbus_number; u16 vntb_pid; @@ -460,10 +465,13 @@ static int epf_ntb_config_spad_bar_alloc(struct epf_n= tb *ntb) ntb->reg =3D base; =20 ctrl =3D ntb->reg; + ctrl->version =3D CTRL_VERSION; ctrl->spad_offset =3D ctrl_size; =20 ctrl->spad_count =3D spad_count; ctrl->num_mws =3D ntb->num_mws; + memset(ctrl->mw_offset, 0, sizeof(ctrl->mw_offset)); + memset(ctrl->mw_size, 0, sizeof(ctrl->mw_size)); ntb->spad_size =3D spad_size; =20 ctrl->db_entry_size =3D sizeof(u32); @@ -695,15 +703,31 @@ static void epf_ntb_db_bar_clear(struct epf_ntb *ntb) */ static int epf_ntb_mw_bar_init(struct epf_ntb *ntb) { + struct device *dev =3D &ntb->epf->dev; + u64 bar_ends[BAR_5 + 1] =3D { 0 }; + unsigned long bars_used =3D 0; + enum pci_barno barno; + u64 off, size, end; int ret =3D 0; int i; - u64 size; - enum pci_barno barno; - struct device *dev =3D &ntb->epf->dev; =20 for (i =3D 0; i < ntb->num_mws; i++) { - size =3D ntb->mws_size[i]; barno =3D ntb->epf_ntb_bar[BAR_MW1 + i]; + off =3D ntb->mws_offset[i]; + size =3D ntb->mws_size[i]; + end =3D off + size; + if (end > bar_ends[barno]) + bar_ends[barno] =3D end; + bars_used |=3D BIT(barno); + } + + for (barno =3D BAR_0; barno <=3D BAR_5; barno++) { + if (!(bars_used & BIT(barno))) + continue; + if (bar_ends[barno] < SZ_4K) + size =3D SZ_4K; + else + size =3D roundup_pow_of_two(bar_ends[barno]); =20 ntb->epf->bar[barno].barno =3D barno; ntb->epf->bar[barno].size =3D size; @@ -719,8 +743,12 @@ static int epf_ntb_mw_bar_init(struct epf_ntb *ntb) &ntb->epf->bar[barno]); if (ret) { dev_err(dev, "MW set failed\n"); - goto err_alloc_mem; + goto err_set_bar; } + } + + for (i =3D 0; i < ntb->num_mws; i++) { + size =3D ntb->mws_size[i]; =20 /* Allocate EPC outbound memory windows to vpci vntb device */ ntb->vpci_mw_addr[i] =3D pci_epc_mem_alloc_addr(ntb->epf->epc, @@ -729,19 +757,31 @@ static int epf_ntb_mw_bar_init(struct epf_ntb *ntb) if (!ntb->vpci_mw_addr[i]) { ret =3D -ENOMEM; dev_err(dev, "Failed to allocate source address\n"); - goto err_set_bar; + goto err_alloc_mem; } } =20 + for (i =3D 0; i < ntb->num_mws; i++) { + ntb->reg->mw_offset[i] =3D (u32)ntb->mws_offset[i]; + ntb->reg->mw_size[i] =3D (u32)ntb->mws_size[i]; + } + return ret; =20 -err_set_bar: - pci_epc_clear_bar(ntb->epf->epc, - ntb->epf->func_no, - ntb->epf->vfunc_no, - &ntb->epf->bar[barno]); err_alloc_mem: - epf_ntb_mw_bar_clear(ntb, i); + while (--i >=3D 0) + pci_epc_mem_free_addr(ntb->epf->epc, + ntb->vpci_mw_phy[i], + ntb->vpci_mw_addr[i], + ntb->mws_size[i]); +err_set_bar: + while (--barno >=3D BAR_0) + if (bars_used & BIT(barno)) + pci_epc_clear_bar(ntb->epf->epc, + ntb->epf->func_no, + ntb->epf->vfunc_no, + &ntb->epf->bar[barno]); + return ret; } =20 @@ -1034,6 +1074,60 @@ static ssize_t epf_ntb_##_name##_store(struct config= _item *item, \ return len; \ } =20 +#define EPF_NTB_MW_OFF_R(_name) \ +static ssize_t epf_ntb_##_name##_show(struct config_item *item, \ + char *page) \ +{ \ + struct config_group *group =3D to_config_group(item); \ + struct epf_ntb *ntb =3D to_epf_ntb(group); \ + struct device *dev =3D &ntb->epf->dev; \ + int win_no, idx; \ + \ + if (sscanf(#_name, "mw%d_offset", &win_no) !=3D 1) \ + return -EINVAL; \ + \ + idx =3D win_no - 1; \ + if (idx < 0 || idx >=3D ntb->num_mws) { \ + dev_err(dev, "MW%d out of range (num_mws=3D%d)\n", \ + win_no, ntb->num_mws); \ + return -EINVAL; \ + } \ + \ + idx =3D array_index_nospec(idx, ntb->num_mws); \ + return sprintf(page, "%llu\n", ntb->mws_offset[idx]); \ +} + +#define EPF_NTB_MW_OFF_W(_name) \ +static ssize_t epf_ntb_##_name##_store(struct config_item *item, \ + const char *page, size_t len) \ +{ \ + struct config_group *group =3D to_config_group(item); \ + struct epf_ntb *ntb =3D to_epf_ntb(group); \ + struct device *dev =3D &ntb->epf->dev; \ + int win_no, idx; \ + u64 val; \ + int ret; \ + \ + ret =3D kstrtou64(page, 0, &val); \ + if (ret) \ + return ret; \ + \ + if (sscanf(#_name, "mw%d_offset", &win_no) !=3D 1) \ + return -EINVAL; \ + \ + idx =3D win_no - 1; \ + if (idx < 0 || idx >=3D ntb->num_mws) { \ + dev_err(dev, "MW%d out of range (num_mws=3D%d)\n", \ + win_no, ntb->num_mws); \ + return -EINVAL; \ + } \ + \ + idx =3D array_index_nospec(idx, ntb->num_mws); \ + ntb->mws_offset[idx] =3D val; \ + \ + return len; \ +} + #define EPF_NTB_BAR_R(_name, _id) \ static ssize_t epf_ntb_##_name##_show(struct config_item *item, \ char *page) \ @@ -1104,6 +1198,14 @@ EPF_NTB_MW_R(mw3) EPF_NTB_MW_W(mw3) EPF_NTB_MW_R(mw4) EPF_NTB_MW_W(mw4) +EPF_NTB_MW_OFF_R(mw1_offset) +EPF_NTB_MW_OFF_W(mw1_offset) +EPF_NTB_MW_OFF_R(mw2_offset) +EPF_NTB_MW_OFF_W(mw2_offset) +EPF_NTB_MW_OFF_R(mw3_offset) +EPF_NTB_MW_OFF_W(mw3_offset) +EPF_NTB_MW_OFF_R(mw4_offset) +EPF_NTB_MW_OFF_W(mw4_offset) EPF_NTB_BAR_R(ctrl_bar, BAR_CONFIG) EPF_NTB_BAR_W(ctrl_bar, BAR_CONFIG) EPF_NTB_BAR_R(db_bar, BAR_DB) @@ -1124,6 +1226,10 @@ CONFIGFS_ATTR(epf_ntb_, mw1); CONFIGFS_ATTR(epf_ntb_, mw2); CONFIGFS_ATTR(epf_ntb_, mw3); CONFIGFS_ATTR(epf_ntb_, mw4); +CONFIGFS_ATTR(epf_ntb_, mw1_offset); +CONFIGFS_ATTR(epf_ntb_, mw2_offset); +CONFIGFS_ATTR(epf_ntb_, mw3_offset); +CONFIGFS_ATTR(epf_ntb_, mw4_offset); CONFIGFS_ATTR(epf_ntb_, vbus_number); CONFIGFS_ATTR(epf_ntb_, vntb_pid); CONFIGFS_ATTR(epf_ntb_, vntb_vid); @@ -1142,6 +1248,10 @@ static struct configfs_attribute *epf_ntb_attrs[] = =3D { &epf_ntb_attr_mw2, &epf_ntb_attr_mw3, &epf_ntb_attr_mw4, + &epf_ntb_attr_mw1_offset, + &epf_ntb_attr_mw2_offset, + &epf_ntb_attr_mw3_offset, + &epf_ntb_attr_mw4_offset, &epf_ntb_attr_vbus_number, &epf_ntb_attr_vntb_pid, &epf_ntb_attr_vntb_vid, --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021125.outbound.protection.outlook.com [52.101.125.125]) (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 5AEB0335066; Sun, 18 Jan 2026 13:55:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.125 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744516; cv=fail; b=WmkCWijAm6PS9PdO6A6ejMlrrCuhYKkECT+A+KW91EZfT9a/MmX4sfFxdhzVPDZ5BTM95QROyOrbk0Ozj+6cDZNbC2xwIy1fjJBzB046uhNdnj3EeEN1kSVVLVZ/aKV8H+oJfA0ObYXs9u/CS6t4GWMCoGGFIxiHG5jlH6bycpI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744516; c=relaxed/simple; bh=TwA7jYa8EdOldPUFqQXn8qY8Gc/AzIrQtEiPCOic/d8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=l50pH7id9swZU+MuTsSIhORjT77ImiCHXnMgxuD5JFqc/shW8TkqcClHxrPTLlSD3KoCrx7qbt5Y8hFbw2ikdapq8Y6IIpzp+jUVPQpvVOD1pYJIuD8OlG/uDCTCfX7rLRUXr/iIxPAjgTec9fHfh7XNEhu/nEzANurRr3QucEA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=ZzfyE1cd; arc=fail smtp.client-ip=52.101.125.125 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="ZzfyE1cd" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=gIzDA+SKgLM1/N32MUPGqbh1iRaX0538RYWXzLPV24YvLf95OiycGxroGEMSoe7m4D8Ku3l0cbXu0QxchOyO1sazyDx9DRL7GA7/WS87RwF0iIGM3We33nwpo9JgYTcDwllUKh+KydjigYkESouztDcO5hVtgyasTgMBR5NJv1Dq+CJqrXuZ5O0hgJI/KuFEMrAsGyJLCJmxajwlSE+mVEcGUTSi3b3/Wu+JplP2DHvLO+lpEBOv7bofyoSV1oBC5Wg7uvA9jDAq+7awlgvJrVRy3YH+oSZdpMdrsMgU3hP+/3UlPvUpYERAadY5RraAz36SbauiB4JVdGkGreKyGA== 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=ByMAQyC4BUFQ3GyYv0jpEj7XT0XIdZJsc0QSXRyfyhw=; b=Z3P4NRA63BsVHq/P3gkE509ude1DOmpmY9yPhJF+yZ4nQ9cb/8NH1LDCicn4PrGm3+FZjpz7N2/Kx5IBopwWtnUXIlbdMn2NUpzbQD4QFV3HdaZslFULefX3WAvrOm213TgTNmzB41Od+VKT269wqgiWTxx8d69c5wzPU0cGzVoPacIkpWTk61SXeYbNDsFzE1Vg/VITaujGDU88AHqNR2OEr3M0p1jUlA6A2WL4zAg1kAKJF8K/lQABX3+z1VHjD+uuYIJKw4eXEIw+hoXuzXAPANpX7bw+gK3LZGpktPItuEe9ie1uqRHPtHrrfuPC6QHwFKTVsXNZmI4twq/1gg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ByMAQyC4BUFQ3GyYv0jpEj7XT0XIdZJsc0QSXRyfyhw=; b=ZzfyE1cd6en957vHHL6fLoCR+YKApr2uawu3xscJBE9u9YVzqn+Ss5AwzWdQ8NI+xjh1Bjhkoftptx2wJ1iO72wVRnbZHM2OeSMgsZOS7Gag+cq44+bUmw6IbkBt3uEFmXoXDyWtDokT5gk6BPN52rEqNaXHMGQqtLlUeMtoO2M= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:54:57 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:54:57 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 07/38] NTB: epf: Reserve a subset of MSI vectors for non-NTB users Date: Sun, 18 Jan 2026 22:54:09 +0900 Message-ID: <20260118135440.1958279-8-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0131.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:37f::9) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 97a809a1-5d41-442b-c7a7-08de56992a9d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?4+5PB6YLGQCUF+7B5NJoTbYLU2o5eSbA/lTOXASh6bpZLubtSqOnGo6QAo/A?= =?us-ascii?Q?8mt7RRAk60S1vwDGTLHFl7v9yRD1iIkwXfn41WdTWSHNxjjKeOiUtUrDaYAS?= =?us-ascii?Q?G1b+0NjGW68LNWd62IzFHVNOjkGhouVxgTKA0V2fbjuR2Muox5JeL1kvlm10?= =?us-ascii?Q?Q4O59Phs+YtB1p3lj1F+U2Qd6iLoFVe1xA4GXCtr4wHIu9PMosxdOYV4Hd9S?= =?us-ascii?Q?tRkYAPN1NqsjkAS2vzfVYEKc5hwIuSBev7bHlou3Wlr49WTfvlIULkDAjIBY?= =?us-ascii?Q?XheXOOoUGvisLixFQk9zPdrE1czCs08x9n7GC5wHjIMZsw0M5TlPer6xyA+5?= =?us-ascii?Q?Oy6yHNakHbOJLhWdB5jHiQZr0XBh99KFcbWgEPVlgnxJrLyH2BDd5d3Kf7OV?= =?us-ascii?Q?HQkgALz/4efCgeShUNiTNI1qtA2/3TxzAoHUno5qwTobjVZtZVf9ckcrPxCz?= =?us-ascii?Q?zUKhRtM2CRAYP2dQdcaLDhM09EuuXcUAl7XaI1FH3//mIXFTttKa4BX/OTa/?= =?us-ascii?Q?Ukn4xkMwnqVZD8VT3dN6uMsTFtWFUwn4MxWy+h1k7ZGDpcljXzoJQexb/tIw?= =?us-ascii?Q?oznDbhMcgGWhFDbfsTGOcKPEiFlOMzD+/DBZ/3iNWxagFP86WJtQQvgmL9kZ?= =?us-ascii?Q?AC/SQ102cEhS+1AT8xYNyMfNJ7dzJqsl1NhUwp14aHXBFuZ8u13kZiAQvw6H?= =?us-ascii?Q?lqj01gb95HfYydbv38J0HUkPOEkes6YCioRnds2d4a6Kn6kkTdTjy8cnZQIw?= =?us-ascii?Q?ni7ZHVNLIQI5F9Ccx9CJnB00om0JfElZjybKf7GqKBVRsww7iWgs8PpFzOmR?= =?us-ascii?Q?99aonRnDBUEkQh+xaLiLCLMPbHLbxH6E9RMpgrat+GVbeTJVslpdbTu7aCNQ?= =?us-ascii?Q?IkKVpswwgMw9csV+Dpac0b2YI9zaXO9WHA+vsP0WTew2aCbuKdDwDY7iygPk?= =?us-ascii?Q?U5M/VIZoUG1bCX2JCMeW2FlLHfDPKSqcHRiB/foqkgdYYYkhh054+bu1yXlX?= =?us-ascii?Q?Iyu1quF7mq+kvKzmGUxOgVNy1dIH3MZLKEeXlktOkMhHtBgqk+LkJpfZBvzb?= =?us-ascii?Q?NrGIfIzg9kmZIlW7uY6B3K9QVa37skU64MYVWyo5+mpZ4JYMg6wHh6x4TC/y?= =?us-ascii?Q?cx9YpiV2ycmsvAvXtTWBTuoW67JyCQ6guD2Bl0tFxap6ILGHjFG031jHrNeN?= =?us-ascii?Q?TG4rMJS7ZeKc7ltwBy0YRmvDlPDc9XTN/MjubrvBjeUJrA02OeTVW9KJbEc7?= =?us-ascii?Q?c2TUwA318qsqP1Kf3DgfoVqBH5SnwtgtObwsIQAeMz11Fdbw0UmpTpekEWlk?= =?us-ascii?Q?jb7F6CpwPZpGCK/2Ah3MIXX3s/WF9GG7NMuEVrZn/y0udPQ4CyZBCHxA/eue?= =?us-ascii?Q?rcOeoh+C+xL9jImL8ZXVjVjfpO27EOSdySJsc/ldWXeSxPNpiZZY+v2xGJoN?= =?us-ascii?Q?FMxPU7qXNbeS5QywZ+zVXwklhuzR26BKVwqdAvn9uWU16ApGoW7bTHmbTvOk?= =?us-ascii?Q?YmyEy9B4DmOmQKJeNLlJuLHEMMVjwWOxD3Tx/e6zEAYJ7aFlFPsDiXn7u+AD?= =?us-ascii?Q?Id9x9i3SHy8sDIRVvP8XMSCrlXMj9270PLkv1vyS67mNnofKdxoqL+LvMvqI?= =?us-ascii?Q?Hw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?RapIuY1lCgonio4mc1V7+AIkxwCg1sYvOZmEHCQqg3GK5poYI4JlhP+FkNGF?= =?us-ascii?Q?G7KExEog11uG+zeYrZUnfX3bPihJeAv5ahgUSG9Q+rAFKhp/dMxBWAZpOO3M?= =?us-ascii?Q?OCuluarMhcV4YK++2Y0bZiyAVNaOL3dmkBoqtx9vQQpr7ZeqpaXhPXFd8ceE?= =?us-ascii?Q?amSWHkOIQ13YjP+ssdKBqmqW2gNKbDx5T4eQLUWnmW09U6IWgr6dXQKMG8aD?= =?us-ascii?Q?s8J0s/XcxjxDd4s1btJa05OHG/SZvvFXyL/7nSZSvNepuXKZVWQjWpqadaPz?= =?us-ascii?Q?8CxICkuTnP8I1c8G7+6ZZxHBjUNShf+PGMNFp6Cuwu1wAAZVRcCIfWsyntBV?= =?us-ascii?Q?+w7Fea57dJiIOBVoFeyfDmw6Y/+S9iRZOgmg2+MwrqGhFVkSDgQQ8X3Vbz3o?= =?us-ascii?Q?l/qyiGANf4FiMd7iWq8vLJ7daMocpWCZNnCi9aFaF3S/OaCi0DY2OuGsoX+X?= =?us-ascii?Q?QWdsM6KjSwBp8vqD4erlxcX5VQ+oaOJ4VCOR7YwoFMyIOoOjqpzIQ/7kfsue?= =?us-ascii?Q?+qft32BUh2XxVGySuu0zrsLZgrEhUu9MkEXaMWtO+F0154cCjEyax7NiT+ty?= =?us-ascii?Q?aS9rtHhW3l2B1S6ZsifQ482sXTCn4i+Ein4V68fcWXhk6O6UbxB0Wnn+3qXU?= =?us-ascii?Q?HcRxChN0u4149PW2W6DsjZ/8PH4SbpufNHqKPLXjt7oJ5CgLOj1iB8fzhBvk?= =?us-ascii?Q?nTHTbfHL7ltwouiZtyxvqgnXU13ZrD6gCIsMMojYQJTCF/Ny+RVFxmrz6LAe?= =?us-ascii?Q?qO/JQ3frqVCOppOsHkYkJEXXvNlbv4g1gCAW/nO+U15JMi4ZC0MVJ+snM9Oa?= =?us-ascii?Q?aPo6iqawh6A4khmOwu1i1c3rxRb+ORH2jW6rpJgj+fh6ARBm+4DA7sd4SnQe?= =?us-ascii?Q?NviaWNly67X+4IDXqYhInW39gk5h/FmTQZ5rmrZBd6+HQXLzKB6795snwfw4?= =?us-ascii?Q?EzspQIaAjZxn9fyNKAf3lFzLAc5mMACc1u1vJGr8WrnKMGRRrYbGvi7AjmzH?= =?us-ascii?Q?XTRsFf65pn+Bl4iSRZ4g82Bghv8icr7JvOUXfm5XkuRWc2EVTkJDorNu2pyD?= =?us-ascii?Q?qaYnOOkqtOU3d4gCQOk0kGmq4z/sFKF0eYANtGazbNuUyYos4EMQv3Tw7ndY?= =?us-ascii?Q?NPDrZ5n6rhYnImy5CLVTKlV8hfjDzn7YJewglpFONA50isII9QNHIfK+j0TP?= =?us-ascii?Q?YZ49abkyh3VfJI+Zn0H9wnHCPxN4kADmskLZwqfJWVgia2ysgyo0L5gbRV5u?= =?us-ascii?Q?tOe9q25vDIFs5M0QKSvEv0DNRyzdYzYyxw2IFMJ137mvWMtuCRi5sUgNYf5c?= =?us-ascii?Q?sMDDIzJFgRZCD8h3ZK8Jdyc7Jo5GBWsZRWKLkozSYVJ3GnGPTTvHqplaJcR6?= =?us-ascii?Q?D0fTvnaIDSmpmScylEi7j2Jkgqr14CTTVG2NRQMz9StHRMe38bil5cT9alJD?= =?us-ascii?Q?rt8xpXfN5tZGfJgk5cTipi9Z+RMuATdxVg11aB/awLxxwhnSsx0UhPaW+Z1q?= =?us-ascii?Q?KjOrNaEzEmUo9VniVOJ/fZRarnxFLMNWsNEeupxyjW15dZ5qhdlZAAl+Swp1?= =?us-ascii?Q?KRoh3CJbdECp2ssbBMoTMdk5WeoanBgWjwUqSIAbD2lK8ayxm/PyyBTyWI0t?= =?us-ascii?Q?wx9ua23U+UX4Gc0+w8uGxJnTC4xEYMVftfF53G7SoZTXSVZMnztR0vvu8vtc?= =?us-ascii?Q?AaX+vgpHixxCaIz1ApscYWJnld3PNBVJf1SFDgGK4WUCaEaIFqpwcJ6Q6THr?= =?us-ascii?Q?BPKn17urbo3A1YH4NIR/L/Ow1dPjsJlILHY/Z5e7GWUJDQJH24tb?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 97a809a1-5d41-442b-c7a7-08de56992a9d X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:54:57.8577 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: GAd8dAMKl5LCXKFUvKxBpnnCoK4B6KTLui6rU31t5kQYicvE38Cgl6MMx1Qv6eCTXy512GZMxWhNh4mRKGu7Vg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" The ntb_hw_epf driver currently uses all MSI/MSI-X vectors allocated for the endpoint as doorbell interrupts. On SoCs that also run other functions on the same PCIe controller (e.g. DesignWare eDMA), we need to reserve some vectors for those other consumers. Introduce NTB_EPF_IRQ_RESERVE and track the total number of allocated vectors in ntb_epf_dev's 'num_irqs' field. Use only (num_irqs - NTB_EPF_IRQ_RESERVE) vectors for NTB doorbells and free all num_irqs vectors in the teardown path, so that the remaining vectors can be used by other endpoint functions such as the integrated DesignWare eDMA. This makes it possible to share the PCIe controller MSI space between NTB and other on-chip IP blocks. Signed-off-by: Koichiro Den --- drivers/ntb/hw/epf/ntb_hw_epf.c | 36 ++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/drivers/ntb/hw/epf/ntb_hw_epf.c b/drivers/ntb/hw/epf/ntb_hw_ep= f.c index 4b3fa996219a..dbb5bebe63a5 100644 --- a/drivers/ntb/hw/epf/ntb_hw_epf.c +++ b/drivers/ntb/hw/epf/ntb_hw_epf.c @@ -54,6 +54,7 @@ =20 #define NTB_EPF_MIN_DB_COUNT 3 #define NTB_EPF_MAX_DB_COUNT 31 +#define NTB_EPF_IRQ_RESERVE 8 =20 #define NTB_EPF_COMMAND_TIMEOUT 1000 /* 1 Sec */ =20 @@ -92,6 +93,9 @@ struct ntb_epf_dev { unsigned int spad_count; unsigned int db_count; =20 + unsigned int num_irqs; + unsigned int num_ntb_irqs; + void __iomem *ctrl_reg; void __iomem *db_reg; void __iomem *peer_spad_reg; @@ -345,7 +349,7 @@ static int ntb_epf_init_isr(struct ntb_epf_dev *ndev, i= nt msi_min, int msi_max) u32 argument =3D MSIX_ENABLE; int irq; int ret; - int i; + int i =3D 0; =20 irq =3D pci_alloc_irq_vectors(pdev, msi_min, msi_max, PCI_IRQ_MSIX); if (irq < 0) { @@ -359,33 +363,40 @@ static int ntb_epf_init_isr(struct ntb_epf_dev *ndev,= int msi_min, int msi_max) argument &=3D ~MSIX_ENABLE; } =20 + ndev->num_irqs =3D irq; + irq -=3D NTB_EPF_IRQ_RESERVE; + if (irq <=3D 0) { + dev_err(dev, "Not enough irqs allocated\n"); + ret =3D -ENOSPC; + goto err_out; + } + ndev->num_ntb_irqs =3D irq; + for (i =3D 0; i < irq; i++) { ret =3D request_irq(pci_irq_vector(pdev, i), ntb_epf_vec_isr, 0, "ntb_epf", ndev); if (ret) { dev_err(dev, "Failed to request irq\n"); - goto err_request_irq; + goto err_out; } } =20 - ndev->db_count =3D irq - 1; + ndev->db_count =3D irq; =20 ret =3D ntb_epf_send_command(ndev, CMD_CONFIGURE_DOORBELL, argument | irq); if (ret) { dev_err(dev, "Failed to configure doorbell\n"); - goto err_configure_db; + goto err_out; } =20 return 0; =20 -err_configure_db: - for (i =3D 0; i < ndev->db_count + 1; i++) +err_out: + while (i-- > 0) free_irq(pci_irq_vector(pdev, i), ndev); =20 -err_request_irq: pci_free_irq_vectors(pdev); - return ret; } =20 @@ -502,7 +513,7 @@ static int ntb_epf_peer_db_set(struct ntb_dev *ntb, u64= db_bits) u32 db_offset; u32 db_data; =20 - if (interrupt_num > ndev->db_count) { + if (interrupt_num >=3D ndev->db_count) { dev_err(dev, "DB interrupt %d greater than Max Supported %d\n", interrupt_num, ndev->db_count); return -EINVAL; @@ -512,6 +523,7 @@ static int ntb_epf_peer_db_set(struct ntb_dev *ntb, u64= db_bits) =20 db_data =3D readl(ndev->ctrl_reg + NTB_EPF_DB_DATA(interrupt_num)); db_offset =3D readl(ndev->ctrl_reg + NTB_EPF_DB_OFFSET(interrupt_num)); + writel(db_data, ndev->db_reg + (db_entry_size * interrupt_num) + db_offset); =20 @@ -595,8 +607,8 @@ static int ntb_epf_init_dev(struct ntb_epf_dev *ndev) int ret; =20 /* One Link interrupt and rest doorbell interrupt */ - ret =3D ntb_epf_init_isr(ndev, NTB_EPF_MIN_DB_COUNT + 1, - NTB_EPF_MAX_DB_COUNT + 1); + ret =3D ntb_epf_init_isr(ndev, NTB_EPF_MIN_DB_COUNT + NTB_EPF_IRQ_RESERVE, + NTB_EPF_MAX_DB_COUNT + NTB_EPF_IRQ_RESERVE); if (ret) { dev_err(dev, "Failed to init ISR\n"); return ret; @@ -704,7 +716,7 @@ static void ntb_epf_cleanup_isr(struct ntb_epf_dev *nde= v) =20 ntb_epf_send_command(ndev, CMD_TEARDOWN_DOORBELL, ndev->db_count + 1); =20 - for (i =3D 0; i < ndev->db_count + 1; i++) + for (i =3D 0; i < ndev->num_ntb_irqs; i++) free_irq(pci_irq_vector(pdev, i), ndev); pci_free_irq_vectors(pdev); } --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021073.outbound.protection.outlook.com [40.107.74.73]) (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 5F008334C34; Sun, 18 Jan 2026 13:55:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.73 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744516; cv=fail; b=kheZlAmOq8cLPOTqXFT2g1Dn91GLaLYZWYQZtO5KxR8E5euVfG+6nmjvxWn2ox0gSYFOmT9vT+FhoSdf4rvz7WbIAQo2pAVzGYYni8pA+S1nOlUmJLSP2xT11uvvwwZqPyUz3eaIaobMBTpZuOLnXeWlYTz09jZuIWYqNHFTCVY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744516; c=relaxed/simple; bh=cLAViSjhao4QvjW/zPzAXev/FWT8MW049AIrZB5rn3I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=janjYRhn8vaZi7j4uIsoBZG2fSdVuyA4Vc3GtmA/fdD//oKjPFY/9y49zeALTsddri2nw5B4AaFoX+NT1bHmUWcYiXyfRC6fPZ7ACsLrga4AOLrFM1d+KOQ1S9YORTPMZcNMTXhunte3iEjp2XaECb+AxCrFNOMKGfe5eGmIr3o= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=bYBWNLmn; arc=fail smtp.client-ip=40.107.74.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="bYBWNLmn" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vDUo46QEpzierYgcs893UQE0Eyig61BR0PCNWZP5iT4bTxi81QCDUjCms9b0VrZ2A7dK8+d6DfbnHe2IboAXioJiTKSiNzKJstEsfF3hWSxA2U+YEjtbOVsCow5Gcol7aWz/jJORkPyzNASzbI068silYVqo7DTcuVMCfdR0keXGDBkc7mZAxX2JjIhJtHMuvL27MiHsSURXAZfs7bSPiA+3Ez2jkqdJm9eQ5IHCLaL6Z7qio30TEtWHIVWK/lguWlrEgNDNIhv/O0KtpaDD4jFXgHH+4S6L67rK9IMvlSuKjlWJzj69CiogsKBmpqnFWT5aXBjdRU8tOUrv0ofTZQ== 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=+67+cYoMVE0Yg2nOZH8eOjKF2/2Yp9GhBnnurvRKWqg=; b=KtyF23uFlDTb8xkHddzPEpMrOlj4+UDoO1ep/UrrhRvlfjW4+5y9yRawJfmL3pRYQh0/YEtzRJG37gP62Zz9joqETejbhRVpzeSxrf2sb0e95vNjQiwakIM8QdnCUB1SAZLlweCW3ko8eeslua0ErcQrwJ4IqHOqf0SnzcWfbXMZFuGQCx9a/agdNrmpRANEsfGKPAoHgM+OwCkAkovcK+U4xmM4Jw/BGyGDzQ07QfLECXhXKdjHosoYUMt46wZe6Ix6bwUVbtFkIrJZGy0A9MBhSiNxXwDDYhtser/JTJa4+KPvvGuLAwagF5NwMkctTRd1sminUWwPqH66dZ/lMw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+67+cYoMVE0Yg2nOZH8eOjKF2/2Yp9GhBnnurvRKWqg=; b=bYBWNLmnydtgJlp9wWNVB1KzRxae4BfaqvYJLlmxVUsvoVdZYLqHfNQCNW5+rFUZrVKfXbhznC1XTvtrkmBwLa17Jl+0cOiN7mOoVnNKQN567cgN3y32dUk4Mx/++HcMrvNuFo3MxMpmeyUb/k3U6qpg1vVK1d3ew5Dx+kTGngo= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:54:58 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:54:58 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 08/38] NTB: epf: Provide db_vector_count/db_vector_mask callbacks Date: Sun, 18 Jan 2026 22:54:10 +0900 Message-ID: <20260118135440.1958279-9-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCPR01CA0010.jpnprd01.prod.outlook.com (2603:1096:405::22) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 5ffe6ebe-881c-4a48-f988-08de56992b24 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?6mhejKgg1mwXaG/rPwv3ekA/Po1O2rq07FalHlGYtP84KEE0VJaDW8otpzs4?= =?us-ascii?Q?7Cpqb3gCIPGl/IL7mfpEIFJ/u6Ao/hszijdvlDg7wR8YPF/9MoaZWNMop3le?= =?us-ascii?Q?qm+0QNKX9Hdgoo/Wh8I0Gt4FrWJOzK5mupjB5lYLC3Za1jYMJvRyNuPS84ud?= =?us-ascii?Q?1xUTWSf4jL95nWEMnwPskaXqCwd72XIMu2S6GcvqtQjJyUDIG+aL5/M5UcS8?= =?us-ascii?Q?LZcJkK9ClKqDONvLFJw8sb5DH7gC1A2zrFpvMpvuC6VX7VnLpsJ2Fzrl7WEu?= =?us-ascii?Q?e4kW33OSfwz/K+vGr+SCOYNG5940fWlYkt9/GqVBABuOtQhfie50AEP25jZ+?= =?us-ascii?Q?fiomi3rBDi6YrR+/x32L6EJvmDMPRI2rHPWa7jFXHcTEdSerx3Wup2NhrdKJ?= =?us-ascii?Q?B+smkC8edgL1dqDXiZ3019E3WDYe/B31vHFmaeo1U2JHZ3pxI2lpvAgIO1lq?= =?us-ascii?Q?d1/K5Yq/LNvN+SVMRbujY2PSkxCBXkE1aCV+bjiXyVpbnkNE5fFbTtdRZiEA?= =?us-ascii?Q?GHfJroaaMUOofAzJqDxyCKTaLhuElB7QA7VDzdPc+TemlUt6pbldizTLDFU4?= =?us-ascii?Q?QliT0ZNCP36+VhWV+B6GlRqYP23OXVZnR6vl1bgQpTqKW9i8yIZr+bxDRWWO?= =?us-ascii?Q?qOUWoqZtS44ckjBHAQ+efCVnfd3OxiT7+z+nxAIds3+1+7nT+XW2osg7UN1a?= =?us-ascii?Q?BXhsnD5VxL7Z1dV7j44prjHwBwSavLhmb0S7ltkgqX6Mw8E7BRLzLzp2YNSE?= =?us-ascii?Q?2t/EbUjJ0cxVIVa2aVO/LkxPshWHRQaZC7ixR/GGGr9HFNmMc/7KnqrEImrf?= =?us-ascii?Q?/g8jivVJeB3E4SDY213VtX09Gnb2UxjybXMe3BH8gkUiHwcWxcDqHMBUFwDP?= =?us-ascii?Q?8LNGtGEtxQ5Hc3n2AcI624yPhYLmmoGeWd1NSfiduSITs05IWcNRRbz43KfO?= =?us-ascii?Q?n+9fTgp7SfnBowuXI5GXM3Z+BT4hGg3+DtPNBHLivLZXhqM3LUCJxhG8CPYZ?= =?us-ascii?Q?En21O2xRMnJDqTY5nbLTxRKwPh69qAPmFnBERkbeyjuIRvD/3bcIBOAXbiKf?= =?us-ascii?Q?gy/SnApCd+NmvL1sWWvjXcLuV7CetW7qEVv2wjD7n2p1uPLLmqxdRKJKVVgg?= =?us-ascii?Q?TY1RmDPfjETHIqtUwNGWfoKuvh6U6PdgoDirdX/SUDUIGI8tdvypNQA73tEO?= =?us-ascii?Q?kso2TQGFlRBBeSfVcZ6HEPsxfo+n5VuBSgUUxVGSt+XGLPlTdksZNSIQSI+1?= =?us-ascii?Q?p7S1ZvOnqI3bkKZ4/dX3LhX+4pMg1l5P9TgKOiiZsWFlMIwoOGyKJT5Bpgqn?= =?us-ascii?Q?bdOqtn8SrpLFtG3RGpXi3UzgvdM6janeUv7dUqZCHR7ic02pOFVLGAhLbzgV?= =?us-ascii?Q?PrGyMCzQtP/42h2xE6ehHy4EPdMQb/uiaBzD4bWHbCNHGhYTBmhODoK35ozw?= =?us-ascii?Q?rWdm/qDGOe4EY73skpJqV7oc9NMXe3wK4Rkw7Cblado2RRkfq3WQzGrtmHQp?= =?us-ascii?Q?j+6SMrJ2tB8RbHmirJXpG6t15JntZ4z+J3NeueTbO67af4G5YScFzj5E3y7i?= =?us-ascii?Q?4D1/aTRk9OJMGfx28j1LSezkZ391wxiXIauT3RQrYFMoqHzVBz7Fh7lKvbR8?= =?us-ascii?Q?yQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?iiEp8MbtmD/6kwYu6+9RzafVtGOrFRa/IB9kn36aBFNJUhQ/fMyyeqAd2ItZ?= =?us-ascii?Q?9tppN7AHM1FmXEnku2SqNosMBemvU701Bux//n/i/2yGp6i9QcLHimxlsk4l?= =?us-ascii?Q?EMfxX+ldiBQ5BfUIcr2b3EJlh+0dYQvCj35+CMqGrEpcdVO5t9fMsBRk6U7K?= =?us-ascii?Q?wk4e+kDBTmO37jqT6s0b5CVa2zTD9FfdmvIQ5v61xZqYJyG/YBhH9qcw723S?= =?us-ascii?Q?OyxbQZsgXO4E3hDLe4BcBArFC6NHF/iORGF1M1fLFXKRwtS16Sdrv1hFo4vj?= =?us-ascii?Q?6jLcD3EAeG5k8DQ/ey0vs4gOc/dSqiY4BI8f1X4Prf6b441NslsNExqj0/hR?= =?us-ascii?Q?YM5iHMRzHVMHnlbEW564Nc9KSrGG8fdVE+eBIBuZm6GdOy/6o6H8GrF9JQAI?= =?us-ascii?Q?nnPaQ545JhzI3pcH8aUPAyoR61Cd6lI0ImsPF56q1wi6VJc5mCeXRDl81Dk8?= =?us-ascii?Q?u3VSdtAguKL3+6DEzqsgchUaN+sbD8TgExDsPZNhAX92jPnLiUPVay+wqwPO?= =?us-ascii?Q?KxREoJi/wQkZL5myQAJjdXkPsojKQPUENgJ6MVj06tTZlVGrx7u8TxaT/VkV?= =?us-ascii?Q?GfDYK8KIKkzrYSYlmIT4yYDSze+4L6fqi0+3Dab9X/TTS/iuGRLuhARy4Klt?= =?us-ascii?Q?q/E5XQIRtw57RroQ70PSeV9fBvVShnJA9N3eaGNum6VpLCY8xyn9Xx3UioVl?= =?us-ascii?Q?/+ROPouOWaw3RTzkpI0yszKmXIbCb9yEEzvghQJjbaKrAz04YKvAd8cjfFUh?= =?us-ascii?Q?HwylWXRlv1FjR3QdAfliTlN3YdF8u4BBGdemAUUkVP+fjMqnRXAzJbeHU3TV?= =?us-ascii?Q?VtQHWuskNoLE0ZbMv5pHONAVAkRLg0bqowmHJeNI4smJyaOuxDCQsoeHNuW+?= =?us-ascii?Q?ILn+X2YX8FK6EVLMsK80bcghArfHo0C57ysuJ3AhnEqXQcXogmOs75V19A9r?= =?us-ascii?Q?4dZgUMUGH4L7sQh8vKw6iabju1BOj6fztvYhMBXMgkTsVp/ZCAUBQ/JYs43I?= =?us-ascii?Q?rl6BCQ01KjR/eFqIC6O93AElEV5YQZErYj341jIfHe1vBViDCoNnXsRs+zs6?= =?us-ascii?Q?ZgU9Fwl8cU9GRf+YffZwznJJcUtLWeBX1uVDyBbZqWdRFc89v6lbmq3yFuZI?= =?us-ascii?Q?tPbJQq/4phRTBpvZOrFlQDV3Hp+TVgm+9HHHRN8qHky9BS8fJ/UwwpmtZ/o/?= =?us-ascii?Q?IgZNBpESKCWQjKNhB6OmXPk5SMHnETirzl3r8ccYYoglkoog4cxEtxOzrR2/?= =?us-ascii?Q?0fT6AqAetetrB+VaTgZcRedYKvLlkC9z/zMtQsKXsVoNhOPBTmiocsIBBbS1?= =?us-ascii?Q?w+M+OGdZSKJso8s18U92uYWu9fG/n6l3iYmw4ZgrwwIQI7aV8f6cL1oBQApm?= =?us-ascii?Q?FZ6TPWbQJxcHUI3BvWq6Kb7OAIRTXCrNarIYe/f6jtHmLw3Y7e7IXv2LThdv?= =?us-ascii?Q?ifeSfwq1Q/Vt1Ms09QgReMXu3mdjQt7ZvR+6+ZduaIJAUiv3OdxjxDwClzyi?= =?us-ascii?Q?DV2rNMevI88bdbUDEFEaUHUIctWEzEAXFhDV+MPbrG5vSIn87wf6xcasx+9+?= =?us-ascii?Q?0q/GIXmVmv0hIsSdvffPQ2b9nMUzKDRvlQcVVKsr13Z+S6QePsepi3PN5+Ve?= =?us-ascii?Q?8QUJ1G73OpHoYAlusNt8X2yCXBO69eE5NMIkpVRvm68RsxR2EKk9fKr+FXZ6?= =?us-ascii?Q?93NzrVbMNLmGgClIPzaiDIYNas6vHT0ulmMfvdZgaJ7b5Q4ZBbkFxy4tvpw1?= =?us-ascii?Q?9RLF1S+BKFJnZdB4kGg8hPw0y9MddU2X/8f0acakqATGbgwi2WmI?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 5ffe6ebe-881c-4a48-f988-08de56992b24 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:54:58.7451 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: BlXc9cbXgKcFa77yzk61ynrcjtZi8P4lVBzRth7lZ3vBnL1f8JpW18Zx8akqLMJENE38kU7RGbNy7keStfBEIg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" Provide db_vector_count() and db_vector_mask() implementations for both ntb_hw_epf and pci-epf-vntb so that ntb_transport can map MSI vectors to doorbell bits. Without them, the upper layer cannot identify which doorbell vector fired and ends up scheduling rxc_db_work() for all queue pairs, resulting in a thundering-herd effect when multiple queue pairs (QPs) are enabled. With this change, .peer_db_set() must honor the db_bits mask and raise all requested doorbell interrupts, so update those implementations accordingly. Signed-off-by: Koichiro Den --- drivers/ntb/hw/epf/ntb_hw_epf.c | 47 ++++++++++++------- drivers/pci/endpoint/functions/pci-epf-vntb.c | 41 +++++++++++++--- 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/drivers/ntb/hw/epf/ntb_hw_epf.c b/drivers/ntb/hw/epf/ntb_hw_ep= f.c index dbb5bebe63a5..c37ede4063dc 100644 --- a/drivers/ntb/hw/epf/ntb_hw_epf.c +++ b/drivers/ntb/hw/epf/ntb_hw_epf.c @@ -381,7 +381,7 @@ static int ntb_epf_init_isr(struct ntb_epf_dev *ndev, i= nt msi_min, int msi_max) } } =20 - ndev->db_count =3D irq; + ndev->db_count =3D irq - 1; =20 ret =3D ntb_epf_send_command(ndev, CMD_CONFIGURE_DOORBELL, argument | irq); @@ -415,6 +415,22 @@ static u64 ntb_epf_db_valid_mask(struct ntb_dev *ntb) return ntb_ndev(ntb)->db_valid_mask; } =20 +static int ntb_epf_db_vector_count(struct ntb_dev *ntb) +{ + return ntb_ndev(ntb)->db_count; +} + +static u64 ntb_epf_db_vector_mask(struct ntb_dev *ntb, int db_vector) +{ + struct ntb_epf_dev *ndev =3D ntb_ndev(ntb); + + db_vector--; /* vector 0 is reserved for link events */ + if (db_vector < 0 || db_vector >=3D ndev->db_count) + return 0; + + return ndev->db_valid_mask & BIT_ULL(db_vector); +} + static int ntb_epf_db_set_mask(struct ntb_dev *ntb, u64 db_bits) { return 0; @@ -507,26 +523,21 @@ static int ntb_epf_peer_mw_get_addr(struct ntb_dev *n= tb, int idx, static int ntb_epf_peer_db_set(struct ntb_dev *ntb, u64 db_bits) { struct ntb_epf_dev *ndev =3D ntb_ndev(ntb); - u32 interrupt_num =3D ffs(db_bits) + 1; - struct device *dev =3D ndev->dev; + u32 interrupt_num; u32 db_entry_size; u32 db_offset; u32 db_data; - - if (interrupt_num >=3D ndev->db_count) { - dev_err(dev, "DB interrupt %d greater than Max Supported %d\n", - interrupt_num, ndev->db_count); - return -EINVAL; - } + unsigned long i; =20 db_entry_size =3D readl(ndev->ctrl_reg + NTB_EPF_DB_ENTRY_SIZE); =20 - db_data =3D readl(ndev->ctrl_reg + NTB_EPF_DB_DATA(interrupt_num)); - db_offset =3D readl(ndev->ctrl_reg + NTB_EPF_DB_OFFSET(interrupt_num)); - - writel(db_data, ndev->db_reg + (db_entry_size * interrupt_num) + - db_offset); - + for_each_set_bit(i, (unsigned long *)&db_bits, ndev->db_count) { + interrupt_num =3D i + 1; + db_data =3D readl(ndev->ctrl_reg + NTB_EPF_DB_DATA(interrupt_num)); + db_offset =3D readl(ndev->ctrl_reg + NTB_EPF_DB_OFFSET(interrupt_num)); + writel(db_data, ndev->db_reg + (db_entry_size * interrupt_num) + + db_offset); + } return 0; } =20 @@ -556,6 +567,8 @@ static const struct ntb_dev_ops ntb_epf_ops =3D { .spad_count =3D ntb_epf_spad_count, .peer_mw_count =3D ntb_epf_peer_mw_count, .db_valid_mask =3D ntb_epf_db_valid_mask, + .db_vector_count =3D ntb_epf_db_vector_count, + .db_vector_mask =3D ntb_epf_db_vector_mask, .db_set_mask =3D ntb_epf_db_set_mask, .mw_set_trans =3D ntb_epf_mw_set_trans, .mw_clear_trans =3D ntb_epf_mw_clear_trans, @@ -607,8 +620,8 @@ static int ntb_epf_init_dev(struct ntb_epf_dev *ndev) int ret; =20 /* One Link interrupt and rest doorbell interrupt */ - ret =3D ntb_epf_init_isr(ndev, NTB_EPF_MIN_DB_COUNT + NTB_EPF_IRQ_RESERVE, - NTB_EPF_MAX_DB_COUNT + NTB_EPF_IRQ_RESERVE); + ret =3D ntb_epf_init_isr(ndev, NTB_EPF_MIN_DB_COUNT + 1 + NTB_EPF_IRQ_RES= ERVE, + NTB_EPF_MAX_DB_COUNT + 1 + NTB_EPF_IRQ_RESERVE); if (ret) { dev_err(dev, "Failed to init ISR\n"); return ret; diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/en= dpoint/functions/pci-epf-vntb.c index 4927faa28255..39e784e21236 100644 --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c @@ -1384,6 +1384,22 @@ static u64 vntb_epf_db_valid_mask(struct ntb_dev *nt= b) return BIT_ULL(ntb_ndev(ntb)->db_count) - 1; } =20 +static int vntb_epf_db_vector_count(struct ntb_dev *ntb) +{ + return ntb_ndev(ntb)->db_count; +} + +static u64 vntb_epf_db_vector_mask(struct ntb_dev *ntb, int db_vector) +{ + struct epf_ntb *ndev =3D ntb_ndev(ntb); + + db_vector--; /* vector 0 is reserved for link events */ + if (db_vector < 0 || db_vector >=3D ndev->db_count) + return 0; + + return BIT_ULL(db_vector); +} + static int vntb_epf_db_set_mask(struct ntb_dev *ntb, u64 db_bits) { return 0; @@ -1487,20 +1503,29 @@ static int vntb_epf_peer_spad_write(struct ntb_dev = *ndev, int pidx, int idx, u32 =20 static int vntb_epf_peer_db_set(struct ntb_dev *ndev, u64 db_bits) { - u32 interrupt_num =3D ffs(db_bits) + 1; struct epf_ntb *ntb =3D ntb_ndev(ndev); u8 func_no, vfunc_no; - int ret; + u64 failed =3D 0; + unsigned long i; =20 func_no =3D ntb->epf->func_no; vfunc_no =3D ntb->epf->vfunc_no; =20 - ret =3D pci_epc_raise_irq(ntb->epf->epc, func_no, vfunc_no, - PCI_IRQ_MSI, interrupt_num + 1); - if (ret) - dev_err(&ntb->ntb->dev, "Failed to raise IRQ\n"); + for_each_set_bit(i, (unsigned long *)&db_bits, ntb->db_count) { + /* + * DB bit i is MSI interrupt (i + 2). + * Vector 0 is used for link events and MSI vectors are + * 1-based for pci_epc_raise_irq(). + */ + if (pci_epc_raise_irq(ntb->epf->epc, func_no, vfunc_no, + PCI_IRQ_MSI, i + 2)) + failed |=3D BIT_ULL(i); + } + if (failed) + dev_err(&ntb->ntb->dev, "Failed to raise IRQ (%#llx)\n", + failed); =20 - return ret; + return failed ? -EIO : 0; } =20 static u64 vntb_epf_db_read(struct ntb_dev *ndev) @@ -1561,6 +1586,8 @@ static const struct ntb_dev_ops vntb_epf_ops =3D { .spad_count =3D vntb_epf_spad_count, .peer_mw_count =3D vntb_epf_peer_mw_count, .db_valid_mask =3D vntb_epf_db_valid_mask, + .db_vector_count =3D vntb_epf_db_vector_count, + .db_vector_mask =3D vntb_epf_db_vector_mask, .db_set_mask =3D vntb_epf_db_set_mask, .mw_set_trans =3D vntb_epf_mw_set_trans, .mw_clear_trans =3D vntb_epf_mw_clear_trans, --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020076.outbound.protection.outlook.com [52.101.229.76]) (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 5DF17334C2D; Sun, 18 Jan 2026 13:55:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.76 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744516; cv=fail; b=q+YNM2wDGT0Q+PQbbuuvSmEZDi4l8Bsx1xEfu8d6P6iRnD1QvauoyNVjJMuv14LbJCo1liePkfH2mmsctzI4O9CAaq78czAR/blKboZV2c3p51z81V7V4xlSlkis5PrXLSTztXkQd2TQ2+tbZrX2S7cS9WCU7VW1X9BtqcLhlp4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744516; c=relaxed/simple; bh=j3v/oCrCieCIMH3ghUYx0Es65h8tq+lZ4jZvw5nIk/s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=slaEN/rYM32jL/T4tM/6bXZw7TphM/d/+xKORaYzzl58frx4KFyd/3U5HBobQl23qju42rl2yJzm+j/ByqsjMKNGotumZ97OcX/nXgqvTyo+a9ZRD6PPVcyLi+mvS2mr8QYREYe+mKoGub2u8Yo/hcUa2es95q3iNyUuEtdJSoY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=D1sMSOYo; arc=fail smtp.client-ip=52.101.229.76 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="D1sMSOYo" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=jn8GgfgCvXN2OgoRex1DBYDWvp0hdFp5xQ9jRtM5ja3la7akTdtl9Y5vUmyJ+dAlm38W1LrOFzZuNTogQ1J2EqhoWIR8PZgPJtcxRM6/PIgnI4IDayPAvp+Q8+cipcPWkYPpAj/78BCVFd02Hj8UmNQLCldNy6vbWO/yYi4yi2HXlXGKp+9LJYDOjm3QJFzofF3h71rOmMSlZolz3qDGF9baCQqLMB83JxE/FfYv/lvYndguk+6iMsdBECxRrNFqQc2PGWdYk4W+VFgeLptsJBcBZFuYEox8dhY0O5+3EJuSarFOurnPppDQjG8652IWsP/yUcIKNWYvoNDW92/2Sg== 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=uPH1ItS4tEnUncYycsAP50Ucy9MlDzeZ2R3I57PWSdc=; b=RZ5kNupW9ZfZnBfFYp7RiNMHG3SWb7LWl23HPOB94DC9kofYk2+8OV8b2DU+DjSQVhn/++PUZDGKnN5QiKsmDvZTxSdDjpogN+sduWpH7/vxKpz/RGjAV58kUgDtHLivrJuFtylxpEyxVk8E9FaQYUzo5cWhqV8OWOut+iscMRYwceva/Fj/SSY6wfTplw4G4hlLP3KoqGzBOMBVAADr6mtF6wf82ddB45bnPoOzBsrGT3jK7J5yfwTqc7+m0LrOCRXHJ2Durarayid/RzHSH2YG6/5UQkHJ6DXO7Dq0/74xISDHVbNdIL3jz7/Vhpk7JpzlDu5AT57gsPq2IZNkGw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=uPH1ItS4tEnUncYycsAP50Ucy9MlDzeZ2R3I57PWSdc=; b=D1sMSOYoP7uxJ2p6ByoCiBpJNEZeMKAW3tpmwPS8Szzd7j0Al9ZOraIIlwEtjcx/uuDNOyXiPu7YWoCqITRZr0Li1MQjIr9bpSe0ysCNh4OyYUAL31Er1iao8MFs6+iHLd8bAp6OXQA9sozisEh50x2SwvK0N6xEaf0dOU0843s= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:54:59 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:54:59 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 09/38] NTB: core: Add mw_set_trans_ranges() for subrange programming Date: Sun, 18 Jan 2026 22:54:11 +0900 Message-ID: <20260118135440.1958279-10-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0022.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:2b0::18) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 86bd0cda-dc0c-4132-188e-08de56992b98 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?XzpEOy2u4UUcQu5x6VURIyTSaRB3qKllqPXtD3tsP5soXBDwUpzyDY+iDitW?= =?us-ascii?Q?NdJeyUUCvqa8dE7I8ZwjAU9Ij7MrFJUoHHKQ3nFCYHRwT2aYrk05uY0ZJcL3?= =?us-ascii?Q?1KcRvHmQ9r8s/nhXK+QrHtJ6+B85VUTA6gmHw1V8ctbP185HbsjaDMnt3vo3?= =?us-ascii?Q?EkUG599LuPTL1LJjfKDXDzWxaWzo1gvL2BwjwbPGzQK9uPRFeRkI6LpeYiyI?= =?us-ascii?Q?X5J53JFmNR7eEPl8wtlWjhiRrVqBPEk9UD92lGnRl0GIZAjPWkERdw5zSFNe?= =?us-ascii?Q?l29jMrEBfoCx1bEjV+WJDjRNz+kkYWnjD0q5OxE0q8jOMZH93PZpCwWUCags?= =?us-ascii?Q?C8tA3Wp4XuZyeSK9oxXIzScO/ZjjrOQByVbfyuOYSs1w03SH5FX0yW6Td+Cs?= =?us-ascii?Q?6rgoOvBLpJH2KSW95gg6pETlVXqWqoE1EPLV/U0oprhkrYBeLFV3e80GSvMm?= =?us-ascii?Q?0F+rNk1gAFAlPB13FO48wSBnoOglWXdd8Lh3bGuju3cNyj3Jwn7BmH1HcHeB?= =?us-ascii?Q?7yDHG/3RuZhYmKwfQi6Dz245mDFhjpjPBQ4E0gxBHcohBRJew4697BpL37zj?= =?us-ascii?Q?qwUQ1KYRj2cSwfR7QT0o0jCZfTwkLpCIy3NMAplvXR2RLL/O/UDfysFWiF/S?= =?us-ascii?Q?5OcGdiNbJ/Qui+oPIJju9cBFdZFgDKIPkjuFmI86LFXwkU9gAWl/19Q0D8XD?= =?us-ascii?Q?qVjBAbSWz/H8ZWkvTPAOSKsQecUy3hpl9gEqjZ4VZ1Fm/HTZ5bPjP8U2cs0h?= =?us-ascii?Q?QxJR7+Pvy7BHKQPFR2UiIotOPCx8FkHqUXoN3kVu1b2ExpZKE3MxUCODLE3N?= =?us-ascii?Q?ISfbXTHusytd8D5tBuEpBGvnAccmOuEwR328tzws6xxbCmEfLmPsweAo2Dnp?= =?us-ascii?Q?AhBkkjcz9RUXZr87TCUz/0I5QAPZOGwFPYOMfB4ZpLfPok1iwYVcjdurON66?= =?us-ascii?Q?eU16YLY2cszShESVKHsLy9JaU3l3UODAp7kIQ2312VwMXL8LD9JD666AL00U?= =?us-ascii?Q?b5k3XQhxz0fvzaTufsiFkBWmrBuF+x/rVEGW1te1YYP4ObxPlDdY0HGSUUH4?= =?us-ascii?Q?5UR5WUh3hmUO+2ANH/Zh1xkHe5+c4iBcJDyMdEZJUH4SMUTyo0zuh+WTO5kt?= =?us-ascii?Q?Tnbdwvjzt9vZ36XV5sGrtUGPBt1PnoS8bCyqYOU25emNliCJXk1rGVtbLwk9?= =?us-ascii?Q?knHd69o6LnOtkWUjqOR3HMVWHzGqTZti7zvRSCnJiLo5FpqPYvZZylI8bzPy?= =?us-ascii?Q?ZEkxleRcRPHrITeV1aqlT0fUIbmdYQcCJ1AO2MMoM+nPcmIRyG/A0bpnsHCr?= =?us-ascii?Q?hq/LTV7HqnH7/KB8ne9LOxYM9nFhIHKOswa/6bYUtklr8EEV290BWUGhPcNa?= =?us-ascii?Q?/PisThjLlgF+QBpR150mixnfCW5tMVkE4oOJdOSfOQ3D8hUCuksboTjNY2UO?= =?us-ascii?Q?ytFEf2ip1opHTxujS5NaQD6VZWt99rm5SpSbROECgnxTYnW3Np43AtryglI5?= =?us-ascii?Q?dovIp9PdsxuIvIjSSJBO3doEoMs3mi4+Ts8BMIOd7CcHla5MplMkLE0L/z/R?= =?us-ascii?Q?5aLFkZ8c35jTwYjQJ7cYzGG8lrTtb1c99Qv/hjE2iPU7vwnDEcN28UyXncME?= =?us-ascii?Q?0A=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?1/FVsohvKkQvgKtTmhJ2/f+UIXL3ZLKcEKo6HCWxTet7rxWNgGlQjIu2YlyH?= =?us-ascii?Q?zQOA1Or6dZiCRCwUE0z7bLYueY5rmgNuHEEZPoQr96OHDvbhTeZgKH0Zd0KP?= =?us-ascii?Q?fuJh1d7gP3t3YUYSNXbHUmxJ/KgiUOYtqnL9nim+27o/Or9MA9RhmJL35dD4?= =?us-ascii?Q?pteM+isUwPrkLsmTfuNxs3RThBJmIUq5JLDlmXy6pRQdc27IWs+syk0lhv+/?= =?us-ascii?Q?NWbIaxITvzGdc4/8Q30yh+Mz0Kskw99fNzWvQ+UTjawCopNGgSA7kDnoQEGy?= =?us-ascii?Q?XOnnu9WP1Po3zARl3X4en4O75QlWnNvNDtJAOKjQ5Ad4bSe2T93KcMUsc6+2?= =?us-ascii?Q?aJBu4VYkiQI3v+83sktbmQQzsDmmu2JtGXRTbqXZjRNzd2FikC+YPRSUS0Ad?= =?us-ascii?Q?XKzzbbOplHY9vSNv9sg+aKddr+ifEFKfTKDuwJPasZt2kYnRRKDesvMGPiz4?= =?us-ascii?Q?NsnY1T4U4JUFA2yLbFpAE8U2eR8rGbm3xGeDuKVDcIBit+V7hBG4YtmLVJoK?= =?us-ascii?Q?5f6ZOHseUEzUpw68UfXnKDHu66g9+FWwvzbyUNs8siBiQEF3Qvh7Rs31FdkZ?= =?us-ascii?Q?xmjxosH/V9isT9QNZWBaNX5YOWTklwsN2NIMxDucVhQD9Z9p1SQH+aqd4ALh?= =?us-ascii?Q?jq3yF4QQL9RCjAyd6YFm2ecyIJuJ3pFYT9Rnq60xhBtMFI9FaUeETka25YtC?= =?us-ascii?Q?ChKd7HXc+MdNwSqMSWaOAp1hkWyyS/G32MrbetFSwjJGRFJlAL83wY2Is/1F?= =?us-ascii?Q?KLx5WQ+4X0aS1ZEjfVBnGdqid7pXDMP4vS4eqN/quZZHuQ21KZvIe0O5zYbV?= =?us-ascii?Q?fWFt+YfbWDLlhiTgBN62go7vwRniCMm+haf3mwOavXitDwe4K7TiAyC4QRte?= =?us-ascii?Q?CenB64+VIK3HUXL4PKk3njdM3n851YLPgCk/bLY8AxON59LCmp9Am8soG3ZZ?= =?us-ascii?Q?pSHSnxossUb/zbSZLKHpx7URqytjLpW4XuVsHDdf5tPStOdU2vUvytp1zkFa?= =?us-ascii?Q?YE22CzlEv+Vt/78/cUfv5jLlTc0fzbUJd3uYkfKkUe+GzceIfsXe6HlX0WOo?= =?us-ascii?Q?YhjzUgPFo6nv28r7z1+CutF6h7bDEvtAPFnCAbe1Kt85qslXK11P1YbKUtz4?= =?us-ascii?Q?cG0mBcL1JqlUwBMu+WBrYhTnABqgDl8A3cYoGSqT/Zo7f8rxDX2Lt737Obf3?= =?us-ascii?Q?6gNA2QDNLcBxOCop+littRmd4OJUOS6jwKNxdycySRkIksgU6vFEAzs+Sb6F?= =?us-ascii?Q?GWYbK7hx4ZSkhhq9GZQlmtE654gqvtq5nYdM0bV+NNF69lrsWHYD1rUJ5VkA?= =?us-ascii?Q?euxChzZQwIvswe6qARan2aXT8oIPwDfs1da+dq0vsqa5NzwQQQMTnOcyttjB?= =?us-ascii?Q?UMPSqFnMHT6bgPjDlkabNbswwj4CJOZUdq5Dza0fipgiFPQNPEmFMrtgGbol?= =?us-ascii?Q?Fbvot7Bnrw0DzdjSpnR3pril5fUO3Hvzt+tR6sGzFDEQE5jTmCYQiSrigABH?= =?us-ascii?Q?Mpjz701SMkd5GTqvhQod/smpFzOMSBamwQllLkz8DDLximvAFd1+L4To+ecZ?= =?us-ascii?Q?9Q/99L2MpJis18iKMaupHKw1l7vfu0AzJB1sOADBmj3z1isDt7yt7UXns9uK?= =?us-ascii?Q?Pb7+Zbv+5iO8dWH0WKUMxhU2tbovl1NyC3UpFs22rWIzSoqwQyENCdntdhW8?= =?us-ascii?Q?bY5a+OlB+1Dw6x6HsRjbBliAjI+AirwQZH8CxkvLy0NY/qdfIHLMKgPbXFO9?= =?us-ascii?Q?QBFhWA/C7OMuZmEio8+qsigpmxg2lhnombLP2ihIHAfzn2RhHMFW?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 86bd0cda-dc0c-4132-188e-08de56992b98 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:54:59.5197 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: wXIlt0n92TCfclsbezcgkKIhO6oxE6MrlrMc9c+16dEJXQ+fydSHxOC2Bssek0ER1g5rVtmKF1M9pKvSVOA+ew== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" At the BAR level, multiple MWs may be packed into a single BAR. In addition, a single MW may itself be subdivided into multiple address subranges, each of which can be mapped independently by the underlying NTB hardware. Introduce an optional ntb_dev_ops callback, .mw_set_trans_ranges(), to describe and program such layouts explicitly. The helper allows an NTB driver to provide, for each MW, a list of contiguous subranges that together cover the MW address space. Signed-off-by: Koichiro Den Reviewed-by: Frank Li --- include/linux/ntb.h | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/include/linux/ntb.h b/include/linux/ntb.h index 8ff9d663096b..84908753f446 100644 --- a/include/linux/ntb.h +++ b/include/linux/ntb.h @@ -206,6 +206,11 @@ static inline int ntb_ctx_ops_is_valid(const struct nt= b_ctx_ops *ops) 1; } =20 +struct ntb_mw_subrange { + dma_addr_t addr; + resource_size_t size; +}; + /** * struct ntb_dev_ops - ntb device operations * @port_number: See ntb_port_number(). @@ -218,6 +223,7 @@ static inline int ntb_ctx_ops_is_valid(const struct ntb= _ctx_ops *ops) * @mw_count: See ntb_mw_count(). * @mw_get_align: See ntb_mw_get_align(). * @mw_set_trans: See ntb_mw_set_trans(). + * @mw_set_trans_ranges:See ntb_mw_set_trans_ranges(). * @mw_clear_trans: See ntb_mw_clear_trans(). * @peer_mw_count: See ntb_peer_mw_count(). * @peer_mw_get_addr: See ntb_peer_mw_get_addr(). @@ -276,6 +282,9 @@ struct ntb_dev_ops { resource_size_t *size_max); int (*mw_set_trans)(struct ntb_dev *ntb, int pidx, int widx, dma_addr_t addr, resource_size_t size); + int (*mw_set_trans_ranges)(struct ntb_dev *ntb, int pidx, int widx, + unsigned int num_ranges, + const struct ntb_mw_subrange *ranges); int (*mw_clear_trans)(struct ntb_dev *ntb, int pidx, int widx); int (*peer_mw_count)(struct ntb_dev *ntb); int (*peer_mw_get_addr)(struct ntb_dev *ntb, int widx, @@ -350,6 +359,7 @@ static inline int ntb_dev_ops_is_valid(const struct ntb= _dev_ops *ops) ops->mw_get_align && (ops->mw_set_trans || ops->peer_mw_set_trans) && + /* ops->mw_set_trans_ranges && */ /* ops->mw_clear_trans && */ ops->peer_mw_count && ops->peer_mw_get_addr && @@ -860,6 +870,42 @@ static inline int ntb_mw_set_trans(struct ntb_dev *ntb= , int pidx, int widx, return ntb->ops->mw_set_trans(ntb, pidx, widx, addr, size); } =20 +/** + * ntb_mw_set_trans_ranges() - set the translations of an inbound memory + * window, composed of multiple subranges. + * @ntb: NTB device context. + * @pidx: Port index of peer device. + * @widx: Memory window index. + * @num_ranges: The number of ranges described by @ranges array. + * @ranges: Array of subranges. The subranges are interpreted in ascending + * window offset order (i.e. ranges[0] maps the first part of the MW, + * ranges[1] the next part, ...). + * + * Return: Zero on success, otherwise an error number. If the driver does + * not implement the callback, return -EOPNOTSUPP. + */ +static inline int ntb_mw_set_trans_ranges(struct ntb_dev *ntb, int pidx, i= nt widx, + unsigned int num_ranges, + const struct ntb_mw_subrange *ranges) +{ + if (!num_ranges || !ranges) + return -EINVAL; + + if (ntb->ops->mw_set_trans_ranges) + return ntb->ops->mw_set_trans_ranges(ntb, pidx, widx, + num_ranges, ranges); + + /* + * Fallback for drivers that only support the legacy single-range + * translation API. + */ + if (num_ranges =3D=3D 1) + return ntb_mw_set_trans(ntb, pidx, widx, + ranges[0].addr, ranges[0].size); + + return -EOPNOTSUPP; +} + /** * ntb_mw_clear_trans() - clear the translation address of an inbound memo= ry * window --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021125.outbound.protection.outlook.com [52.101.125.125]) (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 B23DE3358B7; Sun, 18 Jan 2026 13:55:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.125 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744523; cv=fail; b=CiLWwVQMz2KjeilGWgxHZOhKjBynBwl9mjbjLV4VM24888SsA0Mfv+PdEnYsZW4iVo/e0o58660dppQO2XDXztqI1q7n8Qk5Y0pCt100Ma9NVmxPhaF/qZHeRPGysE8eSc7KwjyXQ99Z5LPBERlNusUUyYw3KRMyinZTunzFpQM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744523; c=relaxed/simple; bh=aloQvjQOWlNcnCZ7ZamoSnLyuSFezDKjxdHc1OpmOzk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=BRs/GobyiDXoj0ds4mLAd+W31NDjETidT23v/oQO+f7HYEh9Wgv1Z7Dn+trpsKq+KdDUkAeVylRjAF1w6LSAt0KH9FuE22nfc3+nr6Wuk0Ac8x0fcHRtjMJ+tFb/iz5J2ECH6AZrq3RX16kqtO9J4hOnvy2kNgETB2o82wnZ4B8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=PkS02Dwz; arc=fail smtp.client-ip=52.101.125.125 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="PkS02Dwz" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SeKUDsPw/3yy+OY7CcuDYxkBRZZWjOwFONyoOnPgBo3moCWjK1H8sk9JdQwHBYD551CMepXL5QNgp0Q/M2GfdzT9jF8AVd8MqCPy4jIAgQFqGttPWI2mNNOgM+cKxBzrnt5KeJJWehleB4ze0OKtWjoChe9OIMuv+6PAGr4qZ+7xCku5ye7kUubSRIkyH82nxTLzdfQjry9+qd3ctZxj+1KZWXr3hs0VgeenbjNLueGJqFBKH76S3AhzE3WztVfYDF1LCxSRASGRJKYJyLtpHHGji/kyRjjLALPs4AlxlgLVDs9zr7MIJ41JrVLZRcptNw1Pr+J/BPobwMjgse9tyA== 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=1JCRz0+Ku36HUG2Q8xlNjkeq8zScPBCasvd3Xu84CmQ=; b=iIDggWvE3Oa1SiAJPQ2FX4MNw+5MXUEuwDTdxfNk6Z2NY8MbEJXvwEh6KQqX4etiqB05O/W8rhAkITl3UcBLFIDNAAvuyoEAQfbiARp6ynLchhTzND6+2ehkfCgGsiRVhuI2elUHNcT8PwxVq+OuhLiNq4JrMqsaX+SEt0BNORQU111Sx37kQBLr62lqJZ5eqdbhWmQ0+O5eLZ2v8h0i2oYv+1dHmzEHUojb9Ot4YBicnfZ7zXsJKJ0o4iXBuxSPDhgb0tYRpAlpN8yr0Xl0zKSrVV5IpxFFbzpyL2jeed1KKSCo0DuD5g9VcHjNJheFCtlcjgFwNklZP0tiMhIzhw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1JCRz0+Ku36HUG2Q8xlNjkeq8zScPBCasvd3Xu84CmQ=; b=PkS02Dwzob3AP/kHp45YJJUS3xa3QdtslMguHEzELTzm+dCPI4aVjceKkXlqb6kXH6KxYfVeOY/obf52+UGN1Lc2q47uJj7iFtlSPXYLHjkCSAbSVY3Zhg5kKodDa+/RyHMblZdlreTTn3yhXD8UE+iJOeLMEZ+x+2jXJCQFQQU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:55:00 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:00 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 10/38] NTB: core: Add .get_private_data() to ntb_dev_ops Date: Sun, 18 Jan 2026 22:54:12 +0900 Message-ID: <20260118135440.1958279-11-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYWPR01CA0019.jpnprd01.prod.outlook.com (2603:1096:400:aa::6) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: ce270233-052f-4aa5-92b7-08de56992c1e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?PglOhTUwOFAPD/mdpqMpetQfQIRNvcDcwL0R9r8UTRaPspDWP27RPG87w7xZ?= =?us-ascii?Q?WM5WBtiNuA9ZvZZWp34+JnzGqBzANKU0DlYb5xtUTdwI3bK3jEUBtfJw5r3g?= =?us-ascii?Q?10VmHmnQR8JkMjwI+Vw6KLC8oiTYHzbrhLbOViSf23s06Idqn+JaofQqNM9M?= =?us-ascii?Q?clVx4g7m75tdvatzynkzMsC/nN2XRV18PjN+0eJf/lIVMaG77pOAdkX6ZvuI?= =?us-ascii?Q?x7gHxDHxDgz9oKDGqu16WY5F4iuWw6XR0SLfVwUWXVHjOKTyrZEhGWE6ja6X?= =?us-ascii?Q?NqUYbVjNRPOy1IviQhuB/AeX5Rv5Nk5RqT3ywLi7oVIgw3IdFnpy+GexPWZU?= =?us-ascii?Q?T6oSFkyaFOCpdwcOu3oihvPtwFxTw5FEETQ/9hQqi+u70iAE3BymqRMokG7E?= =?us-ascii?Q?pCH25r8oE8iucVLL9clNSBW3rG5kZAQN8BLqa+mZVG4aexC6Oq3hcrtJAgc+?= =?us-ascii?Q?5wdFQgDedbYM2iWaGCRSr4QqzexVXr/+RFU8B40HW9UnPr5vcOABxQIg0ZcG?= =?us-ascii?Q?u8NDxXPzAJFArQTgzYnrkVD+I4anYL5oT3S6/A0kf5SdznddByUYVoF1a8Nf?= =?us-ascii?Q?dVPBHkZ0oipy6x8EYYHxNONjG1MJxEA9xemiaOU9qAbIIXnPlYwfHfrXS9j0?= =?us-ascii?Q?J20TaQYCHKfkzRHHZITucdH0dZz1R9f+LQugKOkyylQwxUaNttieaLZCfajj?= =?us-ascii?Q?Mcl7sDodqdpyBiIXol46O6jAQ1KjMgznP0RsKtGcId9Ovd2yZmGM4e/x/RxN?= =?us-ascii?Q?t3O0zhKzkRqM9MHNVm5q0UHhFkiCzAxKoNSUmLZXvJyrg7HCBa7jU+J8iZ3J?= =?us-ascii?Q?vurvFOrsWmRG4XUpLbVgN4nWKxBMJJzgTM9jrdRQYciYetZ/JxP4hkhhdGvv?= =?us-ascii?Q?YyEyGf4MmamWDk9ehz5ng6izvKV86xrObYkH2G+qGS7mBQzFTrCdYDdV+PlP?= =?us-ascii?Q?buH5UCXbyjTtMvwMhuiSOA60U9qnlQp8NHRwFHN/dJrgAZBdM5COxxdmNwSx?= =?us-ascii?Q?3oV2LCMucXHp6BA9xLMvAjFONKuWHkHFnKNcmDdPnDa9MXFnzqIsQkQkDPjU?= =?us-ascii?Q?daTF/IkpgJ+6zyUMi68k/LjVzYgSh/TYllHAsBLk4guWsf5fVyrDSA7ZprWW?= =?us-ascii?Q?YWkE710GlNiX9y5CZKKPrTy/Pfy4f48KR7hT8FlIrn0yfq0aJ9+wHRcuUJQv?= =?us-ascii?Q?ahRHofMeYkvBd4UTNAlS1oSmsBR/W9hW7eZ/TJHXUSKSvLUTFM5FGdqapTsp?= =?us-ascii?Q?j0K4sWIWQA/x7AT47vAwiyeaQTS17a+NEnJktZY+bkCpTKhYQIeV6UQZ9pCg?= =?us-ascii?Q?d0eRvrN/Tq4nmX+UeMTArbhHVkdnC0Ipccifooh7E7HG7stbAqs0qeUEXo+d?= =?us-ascii?Q?5Yj5grn850Vg5ybfvZXYrEphCdnZE97Cti3x24TFcJOe3ZgD8uKNWf9sR/q/?= =?us-ascii?Q?z6v2ROVxVW+XaorgkysOZ48PsPdWxsq9TBlG66gRTJyEVQ115885Fs44wJgQ?= =?us-ascii?Q?IvfI6hsOAxF3Bvt+j09gSfkVofzivE3ABzJsWx6v8sAVO5Y0YJ/8LGKum4jZ?= =?us-ascii?Q?TwMQyn4p1U7Mz8W/NUq3P87J+Q6uDedeK2owXH0JuTDgPDpbJTg9NSAapa2S?= =?us-ascii?Q?4w=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?z/6fIJrkZrnjl3I6flY3mQProdgGYVOdxbiBWQ+zYzCvUrK2b1OCAl4iye2+?= =?us-ascii?Q?Oxb3LOgthkDHmmdXdl9gowRNCrOIuu9wIbtFIbGpDFZ7whJv0a9iZWnOe3n7?= =?us-ascii?Q?cVQ/W5GlW/L1gfCvERYT/zetJkWVP/U52vFepqcqwSWIaNx5aWxuO06snpe5?= =?us-ascii?Q?D9543yf1jHBDkMOABUJDShXIJbTJvcFHku7CvyO7EBjnxo0z2bhWCL05ci1r?= =?us-ascii?Q?1O8+y4HTXHBlZleDAXsJxxcH8l7LQmad64qlmJ1OKwSFcZa7HH2Wja1HJLok?= =?us-ascii?Q?m36Qpr49/hOzn4Yx+uVDdAJjzMh3hkKdr0J/NzUjNJ+Hy08sQ4TgHQ3Y/ETI?= =?us-ascii?Q?R3uyOirDRlqkNSoXfPj7cV9w9MpPAlX7vmJ0DWDdWcQkuhmlC9uboRe6nD9k?= =?us-ascii?Q?XSAXkp5mMV3u++hJmqsUBSXvD9EODzVizwQOAYgDBtvG4lFceTn1SkWdJcBa?= =?us-ascii?Q?IhzQK4075S2pcwNfZtSTRbiu1FNUXyZO+TdIvGAYTeufWqLwjrQNJUkNcg68?= =?us-ascii?Q?sx8PF/+k+bfOokjaRQOFKujXI4R+6GQJCvKEYCLOnL417NKSpC//DUw/DpoP?= =?us-ascii?Q?8d1mPf2fi9tLSOkZT7x0d80+yRFN2Of19QY8x9oeUzobVhcHQf4ZMOIczt1x?= =?us-ascii?Q?/sVrTh+aeqaj1Uqp7qhs7rdADQIcSSjeP9U+3zmiUsOCSM9QmRHEc5l5wJhB?= =?us-ascii?Q?blHMtDdFkKgNU8xfenOXKHw2dlRX8QBNWO0rIXlTuGXywukHdtM9vaVl++Wf?= =?us-ascii?Q?3PeXBpHwcXNt4OuOzEb3N/TFks9oNUnUI6ttewQfTW3GEuVsmFj2+ugOjatA?= =?us-ascii?Q?OvU9jWXAOAz0ReoVmJu+WbaTl7RIdPA5O8FMzQKqU7f0pcC10IodLBP9Isa/?= =?us-ascii?Q?pzrF3xtrl1AYsMtzHO+lZ3Nz2iUD6IwjGy2VZ4myg/QCcX1tUf8VRd0/9Yr2?= =?us-ascii?Q?mA4+7QOd41I3I0R+CGcV1DlUw0zyvbbGAkSpAEfJeJFPA5x1pRPFMItIyobH?= =?us-ascii?Q?uofXERYiE5YI2Vb9BXk3Kn9aQ7iREqDj5Fue4VHym1yw0ocLmTG9qVuYLKRY?= =?us-ascii?Q?62Iz0gbcAomLEVjWZNl+2gadyWboSJGYaLz51Yx3BlQECziiz3+WerCYf0up?= =?us-ascii?Q?nq/zkhuqe82jDmAxuW6RD7qHngL9iamC2FsIFlaDxD0QjHbqxdZbOFn55bS5?= =?us-ascii?Q?/jD+bwQ9PuXSuFZ4+vyr5YfWdKuFGBFqwwmIqsigCPRyZswO2a6Qz2z2FSJ8?= =?us-ascii?Q?yA3LfoyGxI8r9ddQw0ChvXuQ0bdO41cYQ266A9GjaNW7e1kGlpuX43NEbxFA?= =?us-ascii?Q?Ly+wYcB0rLju9xeKQLw+0Bxmg6bA2Ly96VqUaAAzzaH5AlUl65mjldJIzN6B?= =?us-ascii?Q?CY6DM01LaXy5iqiyz1jpUbCIWoyWwgkanMKeVtKuKopnq0fiThPsbjO4mugS?= =?us-ascii?Q?EnxMCZLwkHY7ax9jQ02F02w4UyYoDmHK3pYY3PnSeJzeQj3GDGcwwk6Q4UrB?= =?us-ascii?Q?epZcdPm20TBZZ9BO61I9mn3vrTkCLcvb3YhzSAkmgytGLO5zgK1FrdRQ4vdP?= =?us-ascii?Q?yLmLHqKD6b2Usvyx6TZXf5MWMKBZ98jHWGW8n39EIWHm+FmWrtku8cKKvK+5?= =?us-ascii?Q?GMCwxXQ4G0MC6xkzDKyJ8lhwOcvARCmj2Nn24eg5wcJhGx3NvXDIO2lkKdhc?= =?us-ascii?Q?jjapODmsr6lw2Ju0CfBIsCMYdK/ddxDF+lbg8mJslxf3meLbQ8UNTXCTVVHy?= =?us-ascii?Q?X2ysAXjNJnRnC98DyrEhOW7VgctFf+snRfef8yrmqHtNwKtXKZz1?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: ce270233-052f-4aa5-92b7-08de56992c1e X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:00.3825 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ovVYxck9mRYzTdpghjvZSdbvcUmfxInK6FoogSkvh+XiZp70rHc8ajlLrUSAt/cMImsHBpLbUbAXbz8537RPbg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" Add an optional get_private_data() callback to retrieve a private data specific to the underlying hardware driver, e.g. pci_epc device associated with the NTB implementation. Signed-off-by: Koichiro Den --- include/linux/ntb.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/include/linux/ntb.h b/include/linux/ntb.h index 84908753f446..aa888219732a 100644 --- a/include/linux/ntb.h +++ b/include/linux/ntb.h @@ -262,6 +262,7 @@ struct ntb_mw_subrange { * @msg_clear_mask: See ntb_msg_clear_mask(). * @msg_read: See ntb_msg_read(). * @peer_msg_write: See ntb_peer_msg_write(). + * @get_private_data: See ntb_get_private_data(). */ struct ntb_dev_ops { int (*port_number)(struct ntb_dev *ntb); @@ -338,6 +339,7 @@ struct ntb_dev_ops { int (*msg_clear_mask)(struct ntb_dev *ntb, u64 mask_bits); u32 (*msg_read)(struct ntb_dev *ntb, int *pidx, int midx); int (*peer_msg_write)(struct ntb_dev *ntb, int pidx, int midx, u32 msg); + void *(*get_private_data)(struct ntb_dev *ntb); }; =20 static inline int ntb_dev_ops_is_valid(const struct ntb_dev_ops *ops) @@ -401,6 +403,9 @@ static inline int ntb_dev_ops_is_valid(const struct ntb= _dev_ops *ops) /* !ops->msg_clear_mask =3D=3D !ops->msg_count && */ !ops->msg_read =3D=3D !ops->msg_count && !ops->peer_msg_write =3D=3D !ops->msg_count && + + /* Miscellaneous optional callbacks */ + /* ops->get_private_data && */ 1; } =20 @@ -1609,6 +1614,21 @@ static inline int ntb_peer_msg_write(struct ntb_dev = *ntb, int pidx, int midx, return ntb->ops->peer_msg_write(ntb, pidx, midx, msg); } =20 +/** + * ntb_get_private_data() - get private data specific to the hardware driv= er + * @ntb: NTB device context. + * + * Retrieve private data specific to the hardware driver. + * + * Return: Pointer to the private data if available, or %NULL otherwise. + */ +static inline void *ntb_get_private_data(struct ntb_dev *ntb) +{ + if (!ntb->ops->get_private_data) + return NULL; + return ntb->ops->get_private_data(ntb); +} + /** * ntb_peer_resource_idx() - get a resource index for a given peer idx * @ntb: NTB device context. --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020076.outbound.protection.outlook.com [52.101.229.76]) (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 B22FB33507B; Sun, 18 Jan 2026 13:55:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.76 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744523; cv=fail; b=PEdEoXfzzGWh2q1Ml+tRLHlZbwJYnnD3JK9Sy927BkrHsx4W9/kC2iOW92zXvGH4Dz88m5BpNFkR7vpDjQX8lPf6Rg9Exb6GGiJJ6P8hPsnDQjdFFbW9k/4wTmhboARrq+Qy44pOO4nvAEZI02c64epzBSVaLxroLkOiFNZT4lM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744523; c=relaxed/simple; bh=DrTn6qHB+0v81jQAXyAPn6aPzrHivnTVhQx2GTgXvH8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=atonHlE7gbWtwzsTpCM//1gHqSH0Ks1xHj+UySkfPTGDky9utONh+NYqRB55VMFP2e6rEOy/DXE84djsDB5HdDaaSYjzxzV85uWdReRA5Vbesfx4b3zPguAu5ruhEjCSCsneZdAzxx0IQUQxy3+pYBaoef7BvNljXYuI3bsDtT8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=biOrjgYF; arc=fail smtp.client-ip=52.101.229.76 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="biOrjgYF" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZbMe3R0DZq00ynFakhsb5DN5l5LGx1dlIcWe0wuzmppwsQzYu0yYbBxv7kJFmRwlKnARM4yasUYWQQe9NXAroL4joDIi+zusVbxZX/FUYjLTjHrtWqECIlF9C5w27AOs+0XT9vF4EEScX5Gck4n6zaCqPjzwCFbibcOi2nbq5z4hoklVre5IqTHBOdr/RFwmMfpmYCVpph3jcvxj886bn2XqmuXyW6bWTLYATyMiQiChHkbIpXhrSGLiSIOtaevcIgUSvzu+/ddynqcG/2JaOmpoFUvg7f3oi/vast4dg+EXQtCt3qPq/jo4/fG7M76Nlld5p4L6BQQ/CJxkvi2/Jw== 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=eqSJE+I7QlsRgNp763mkkBx+mt6Cf3MvlK7qw4pKHAI=; b=AMVLAgx6hxMN+HpnCgo6/QrgsqJpMR/hXtGITcuYYwQiJJU+hsZXidXLHXX72c5F9wiOJJu8WEdqnW/T5u0b+PP62hLsCErYOvTCYTkXMb7vD6o6Qd1RtK2cHh/5STEF2w3bKRM1QtPyAsDfM0g1o1AAUMn+UneFhV46JhFhgq2O6+ujil4vXop63AGIlXUgLYCzcGUtB2mmNrDm6KEgvSnVspsD2u/1kV0rEQvEhG+rEJBWoUZpzYll/00Q/O+bPjlG47zqxncGKsoAf/LX1kPiCpmd5xfBoBA9K3CFtolxtr+lyefJpqxCYwbmXtmXLYOYR1+InfnADbEwBVHvhA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=eqSJE+I7QlsRgNp763mkkBx+mt6Cf3MvlK7qw4pKHAI=; b=biOrjgYFnCF0Coni6rlfIUSEvuE4BOFVkkRhObgpy3mbsV7wO+MzRvas2l1wayn5SrNC6Rxi6mcjgopdLbNfPnYApNN6CRE3J2WlU1rGJti9uwa+medfZjLMkvWwmwaRi12VSHF9iXqXumTTIeaQgkLjtiXMa63YGgYqqIZHALA= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:55:01 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:01 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 11/38] NTB: core: Add .get_dma_dev() to ntb_dev_ops Date: Sun, 18 Jan 2026 22:54:13 +0900 Message-ID: <20260118135440.1958279-12-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYWPR01CA0026.jpnprd01.prod.outlook.com (2603:1096:400:aa::13) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 60eb01f3-0602-4362-af5c-08de56992c94 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?G8KH8sloEuwsTKGb8OvnVBAwhyfoqX3T52d1Ys71pG4mwepWMja9/pvgqOHg?= =?us-ascii?Q?YYDiRZNY5GNdSmBnO+WXlpGZDjKmbfKDv4kF0nHz4lbdrjruTdAlESJFgJLk?= =?us-ascii?Q?dwoJL+8JtWhDWGH2evugBhO94Q1UWpsRFRHD3F/dPS/K9GdMlnRkm83NR5a5?= =?us-ascii?Q?uvDcDl9Rrocy56Im9B07+AIJBAosofy4naD6Ew4GLGt3hndNT8vb+bBDwsvf?= =?us-ascii?Q?L1JOXFSinrEVFUoO7NqNM5vgQ/MUUjpKqWY7y7YksblCVPj2PZbWvEC/aOFT?= =?us-ascii?Q?3A3+DLSxROcFuqRQ8b8V9KYuxKk42ei0NzuKYPB+LTOgy+UzCS8rXCEZQUuQ?= =?us-ascii?Q?ulZj1b/ceM9d2KcXJl+/LOBdeKroxmu99WVOfv5J8y3Aa+hwH99P2L1h7Bf0?= =?us-ascii?Q?V8+ilIj8lrjGQuDoBvNjUYkEcEcHEfCfAOxr4yazpRurvAhpC0Z/KGI1tjR7?= =?us-ascii?Q?14dkpmJFXcWAED/yaX8gRWVyPESeIHc5VUlZSX4B91JBCfa2IS1aWcu2QyCE?= =?us-ascii?Q?NCkXWo7zyFbMjoFSZEEhpGluVig7KqnN+3Z6wRJ8uhVs9QR48htgr/BzGhYj?= =?us-ascii?Q?LwIcOLgsdCqdzBUywSM/ASd77AgQsouRIcG4QfcqkPVsuto2TEV5cjXBSOBY?= =?us-ascii?Q?XuxKOD8lgGzzCr+NEFcjiugF/baGrZcj7LG4CXBcEbblHhlWKiMz01HdNB4b?= =?us-ascii?Q?kzXZCOKWYNqNBwr4xL0Y2HCMkVFJBUjmwyHjmoQCjihBqo8fb8eco9aYYWi0?= =?us-ascii?Q?5LSSdGEvWxziKS2anjpprAHWFZEM4y+bCGz0GFXzZ503RxZR0UvA/O7JrXm9?= =?us-ascii?Q?hP243NLihbDGMyLOko2lQRn3WvBwaSrMxpF80kVoRkZbKKnzAkqsGv9P3oBh?= =?us-ascii?Q?kLVGK77P6aAN23MLhB+1CKDDTmMzUefZduyDuhTJl4TRmElap0PN4rNAIitm?= =?us-ascii?Q?tPAw/hvP/Kgkrcn+zBeqonnCDAAiHaWPR9DlrYlshNNCXr3MZwqRccasEDPz?= =?us-ascii?Q?ost2324oZf5YeJqlbgDJXzuDDtwwKLBeYxGg3myN9B2LL3u82k8GN7Kbs4uY?= =?us-ascii?Q?DQsDsohd3IbQFhWEW+svUi27jfQAIAfgF7l+S/xeY4QFWreMwqIob5xKL66R?= =?us-ascii?Q?dwRuHsxEcoYLdPq9uMOt4z8fUBkYs3urXg3LczzdiiQ6Y7ITRfKRlZCnQ9ye?= =?us-ascii?Q?HFbunJa46GSxEsl6BZBx5CQntErYT6Ax1Y9HDYGn9rJzI8cCEfbnYhO5t48k?= =?us-ascii?Q?OO3Ap/400XUiYsUJEPP5XmaHXry9PdsT/fuSlfFrhOyTViOJnsnSU77uRI0n?= =?us-ascii?Q?YIT/tC9TXeW5NWnsKt2IMSSXn2DH90246zO+TwM7bFWqpdazUBQ7y0fwWp7r?= =?us-ascii?Q?Us1DkBybUHBPwoyXG+WKcv8m7CMnDRQOvRMwxjwDEC3YtE+FcA7EHBmBGUGJ?= =?us-ascii?Q?wxzkCEPS42fbwM2K35wbNzElNJM1Ul8eiSwUso2Rt9shxLv84tQf3YCOK67F?= =?us-ascii?Q?fkqZ+oM0PF1iXoQuHFUpzlUFfZjlXu5gRubQVDXhn4s2saDhqUDNQXt6a1Nh?= =?us-ascii?Q?9o+9spbM83Qe40TOK0+2/35gaxooR5OG4soFBi8nevZ3i/qPRobLsHOz4ocb?= =?us-ascii?Q?2Q=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?rp0xkuyC2JgXI5xsMsHmnkYGAaAvkVvJvSPDTHj6PODIu1pGn/uqL3qkju8s?= =?us-ascii?Q?nsdEQwIIx87cpRT7XbewPMQM6iYcN3jcgvtyUXksQOwpcxxy4Mub+ThJ1UzG?= =?us-ascii?Q?ePO9PZWQCj2HivFZczXy+0G3Bw5IyZZuL6wVyBNmvHoBAcaI4yQqqwIRZgW2?= =?us-ascii?Q?tBzfaZsWFmiJKMt/nfPTRRqDslfOPthXdcsgV+r1LTEgkahyeUbBlwsaBI23?= =?us-ascii?Q?LnuIqXTOrCGo2dGlznapeQ0EZNIU4cxXRWOG7OpnSxgFYtVtj7IYtVVti8vc?= =?us-ascii?Q?HfGTFJ3wtrym6g+0kTylWuzhiEQ2LeGKU5x8qJM3Vsfdk9p14Jy6cuwaWNmU?= =?us-ascii?Q?cpe8A2Z7svmdx5eC7bOHxGM7sPX+aANXoIrlHUgT4qtiyH23xwge68xzoHgb?= =?us-ascii?Q?ZPeFxFLmpHB0/1yfOWnO5CbSaExsGAk4gADjkJeRWvXIOt3dCcp0x0dg45c5?= =?us-ascii?Q?vzJHK9JP69r6n8ycB5QBbiUdqpKO8IvJBHsiULeul5yyDoBv16mN+vV6etrU?= =?us-ascii?Q?Oi5nca7LC4u9tp4Vx4qzkHvhlB4A/ty+abeCbbWUKCHnFU7A68lZmTlwNKtZ?= =?us-ascii?Q?z1ofdFTSrkC/djPOA3c1YVn5NGrCEEURKcTSgPPetTQP0aXijuLw0LWczlpo?= =?us-ascii?Q?u16IEAJb9Hkx+0+Dd1lwGHs0IQcwj57xgh76/SASZqPKjGHnCuM+YbjtOLql?= =?us-ascii?Q?KrpOhgFlkiUTgoZFrO662CEflNLlXV75HKtCwM2gCTT8ali2qcUPsLYyCkcL?= =?us-ascii?Q?UgtCQXkwI+oqscKQahI3MwhKP1NQ9GDQzWyRIF1/15rd0oFPG9COLnQIi8NQ?= =?us-ascii?Q?ZescWa92M0ysEZ0YjqoL57mSHknXUYGrLeoloCAaFdBaecuW8za2In91LguK?= =?us-ascii?Q?ffOiT3lHe0HhM4VhLCnv+ceSFszh+6rIevaaRhJ0/f5fe/gjY/+3oy0fI0s1?= =?us-ascii?Q?kZU3tAwRAkJDHa8NckbHH/Q+3rW3cLd3MZpC2ocFUwyXgaBTKsSyWF5zMonq?= =?us-ascii?Q?/EUChsv54JmwmO7rjDqlJZtg1sEk/aBiNjoilu5WSlMHXWYFUAbRfXPEkdj8?= =?us-ascii?Q?ot5cPg5942wS2ZMBpMbj2pqa+Q+ZSh+F+NkNCx7xzHv0h1V/skT8I1D2TGFC?= =?us-ascii?Q?ijBIW0y0UsZrIMmL6Yl7IcZGT8UiAOvhqYlBb5czTqGSw1XNQablhcFw9gP3?= =?us-ascii?Q?atPWaxDnZpGw48rI2lO8vNL0tucmCMowxsGV74M90AjM8rKVvsmXnBCEhNzj?= =?us-ascii?Q?RY4r5ovaaSSR83MgSmDdy8dkfrfyEjMfLp2puUHvSgaHCd4ggsLdXmIS9v5o?= =?us-ascii?Q?uVAQDxbtvBvjAf7rg8SO2NT2i4n2hgKalYr5uDOuJ6X07KTjYJuBqlQaXwx/?= =?us-ascii?Q?vO3mzPFb0yc/G6xSwLY8HGiPvCbclUQmn9vzOqhvfnyd9OAD5WbcuFXvr2+t?= =?us-ascii?Q?gP++x1wMNVYYO60xN67LqzSP1l7bqjL9DV2rWgr6cV/o3vTV4Ml0WlbsEJwW?= =?us-ascii?Q?5DHYkhDLVrBcWGH5RvuKwrsB4tOBFNSZSGwM2aRiMrQhqvXNsEqT02qDC9xC?= =?us-ascii?Q?oowQsNWWpdj/yEFR1DT28H9YAK0HPdmXjtiuss8c41maW1Dtle3hhNQm1SdR?= =?us-ascii?Q?Bz3xj+HHPN0VsfOz4XGlAXkZSLz6cdtTnYV5LrmZ0D7hgUIc80cMIPauX/K3?= =?us-ascii?Q?BY5HIv/gzP3kXgOVXnwBn05fnBab/qxHAuyQkDXBdFfqGY69BxndNFnyas2X?= =?us-ascii?Q?R7DBFONYotGTINbR0dIM0Ld8bGgLQHwpW/lOBKLuIGOJ3rNSIvx9?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 60eb01f3-0602-4362-af5c-08de56992c94 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:01.1523 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ReD9DqfYtcYzhUB1JtgSPwlpOFSHY5YGmLGuFiY3dNKJlKOQEot1Dx32GOYj0zscQpczdtbwWPRnPd2VabgQ9g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" Not all NTB implementations are able to naturally do DMA mapping through the NTB PCI device itself (e.g. due to IOMMU topology or non-PCI backing devices). Add an optional .get_dma_dev() callback and helper so clients can use the appropriate struct device for DMA API allocations and mappings. Signed-off-by: Koichiro Den Reviewed-by: Frank Li --- include/linux/ntb.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/include/linux/ntb.h b/include/linux/ntb.h index aa888219732a..7ac8cb13e90d 100644 --- a/include/linux/ntb.h +++ b/include/linux/ntb.h @@ -262,6 +262,7 @@ struct ntb_mw_subrange { * @msg_clear_mask: See ntb_msg_clear_mask(). * @msg_read: See ntb_msg_read(). * @peer_msg_write: See ntb_peer_msg_write(). + * @get_dma_dev: See ntb_get_dma_dev(). * @get_private_data: See ntb_get_private_data(). */ struct ntb_dev_ops { @@ -339,6 +340,7 @@ struct ntb_dev_ops { int (*msg_clear_mask)(struct ntb_dev *ntb, u64 mask_bits); u32 (*msg_read)(struct ntb_dev *ntb, int *pidx, int midx); int (*peer_msg_write)(struct ntb_dev *ntb, int pidx, int midx, u32 msg); + struct device *(*get_dma_dev)(struct ntb_dev *ntb); void *(*get_private_data)(struct ntb_dev *ntb); }; =20 @@ -405,6 +407,7 @@ static inline int ntb_dev_ops_is_valid(const struct ntb= _dev_ops *ops) !ops->peer_msg_write =3D=3D !ops->msg_count && =20 /* Miscellaneous optional callbacks */ + /* ops->get_dma_dev && */ /* ops->get_private_data && */ 1; } @@ -1614,6 +1617,21 @@ static inline int ntb_peer_msg_write(struct ntb_dev = *ntb, int pidx, int midx, return ntb->ops->peer_msg_write(ntb, pidx, midx, msg); } =20 +/** + * ntb_get_dma_dev() - get the device suitable for DMA mapping + * @ntb: NTB device context. + * + * Retrieve a struct device which is suitable for DMA mapping. + * + * Return: Pointer to struct device. + */ +static inline struct device __maybe_unused *ntb_get_dma_dev(struct ntb_dev= *ntb) +{ + if (!ntb->ops->get_dma_dev) + return ntb->dev.parent; + return ntb->ops->get_dma_dev(ntb); +} + /** * ntb_get_private_data() - get private data specific to the hardware driv= er * @ntb: NTB device context. --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021073.outbound.protection.outlook.com [40.107.74.73]) (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 08678337109; Sun, 18 Jan 2026 13:55:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.73 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744523; cv=fail; b=LMRiHohisZAtHaCi+3YyLNHvdSKLrxyGkX29umaIRFKNXTlqOIGBhoHCa8Tgk/qoFha0xCzu2bGYVveeudccpyb15WVCNLuna7Hfv9t+jVwrNNTr6M+vA3CBvurDqIbnqWziBAhT52zbp9ozYSUtydSXqUmxhO6Unwjzvlb8hX8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744523; c=relaxed/simple; bh=AthnnlCSny2A5GQEusolaT2l+6Xgfevjjru/6zRGDvQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=PfhrmimNVLz+Tsq262cb2tOOL0U+9ish/VgqZ3afY33yoJOaXw8pU4XFpt6e4ibNYsENOXs/WSvZ53rJ33zzl/G3LojNXySTXlVOhM7zMjogFdvEJ3HWZAQ78SzMb9ki0LspRIcQAqugNX6ZAj+vjPEFf9ehkKKbOgDwHzQRfPI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=pzuPeAse; arc=fail smtp.client-ip=40.107.74.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="pzuPeAse" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=L+0SeGGIhUEfZmItnNw4itsXbyJfrlseZYwu3ea3j32eYkbPvKYprrbTmWnEmWQmzE/Vwp6K/PMhGB4ckjtRLEbA/OfmjFWf303vGyqJnwgcc+/pbPTHS/wjh7OW9/lVY7JN/kh1HnSbWOMlLa7mxY5fcKSRWph/1uKnMkay1vytUi7j/+demC7YnLh/j27Gly0TdNvMe1hAWzOaP0lOpY9j32khEc31t0554WuT2FXpTjRwKvQAHNODIttze519Ma2tsZhHvznIb5J8xa098XyRe46LaaKprgrMi03HUS4fFDeK15A9ZyLXTG46kyd4oNIuNCTauZc7cd37Wwagbw== 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=u73dlqpDq29oLuvQHiiZb0Tp7TeyOVoMFS8z6lJtl2g=; b=M2xZOm+NReuZNt9cXqEq25k8OmuM/OouBjFooKPNpvq9TmJXAZQdoFUiMFmNC6qIE+G/yWrlcUz+u+1SrxV9eHtO6kr+pbEp7WpxP+uNBKgsJ2BNjrho36axTOlWhkcnOeciJRx22CPti666DNYgAGadxIFYd1YurtzooH/SZI3bGxq4sA5ht4d/P0Pn9hHD2f4J8zhm1Hiv4j7I4Irj+W+67b1pCIGH2DdjdGD7mfXUVZAAFc1NcYk3DTuBp6YX7Wo2omEXG8V2qTAQ+j7/x2HVDFMKGgh7FF5tM3VyzcGHZqWKjlPlF2kn1i9dCMCuYTD7oWVVfkCZ073SfkDAsw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=u73dlqpDq29oLuvQHiiZb0Tp7TeyOVoMFS8z6lJtl2g=; b=pzuPeAsesVsDbkzn6HVOkuLLX7j1veG0dQuQQN1yiKf1bqlgnKGLJQLKWBIBip/JV3TNdVJtavLl5dxsfP6mncSvvDMucEYxkD85eMwjBHWuoK7mmtEODBZU6CWnv/2xinZe8pnAfNCDZ4h93yA6HDwE3MzpWIq49dROhgK4RyU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:55:01 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:01 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 12/38] NTB: core: Add driver_override support for NTB devices Date: Sun, 18 Jan 2026 22:54:14 +0900 Message-ID: <20260118135440.1958279-13-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP301CA0078.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:7b::14) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: a299fabd-418f-45ee-d3f3-08de56992d04 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?W/RNiu502YQa1ompJ4UOTIQaJ2PuREJlDdZpIXYxr7AYamz4/84/dN5ObEYc?= =?us-ascii?Q?FJMXRMzWepyOQzVRlwX6syfaKMW+cnL677uJSzGluayntoxcIGFqgCyUn79H?= =?us-ascii?Q?cOfu70r3QmY84p3MtWhWgGseW+fMsMFK+yZM7+8jlKWACeAjVxSfHV08nl2e?= =?us-ascii?Q?OQT9VYZ5liawAdum6Vy/7uXHS8tmE6O4o/H9ek+etM2Fo1IvRpCqe+72aT05?= =?us-ascii?Q?vECqAiWjrOWum1NHH0EaLOiu8/wApgT1Zmbpk4JwobJnZU2pE77/bgG6hKqi?= =?us-ascii?Q?s++J8xI1HiFs8YLogxIkDWZ7Xhu258VhwiTFYNdKvDva0MS0STlr5XIiHQ8w?= =?us-ascii?Q?ht0oLHYpOELNLF7yqdeeTmGNYeXrqhOvIqvRfgeN28BJW/y6Mjsqef0+MXZm?= =?us-ascii?Q?1cAL+ItRAlX3Z4n60Kmhys9SkcFuOfMIiJ/YP9bMwLMoxtmS7AiJmIHe6Ov6?= =?us-ascii?Q?w1Ve4+yBwZTO818dzDNJYrKTF07yZkTOBqOVFRcrkaXdE3nDyXOK5WJ6R/Oj?= =?us-ascii?Q?fisQSYQiJoVm5adFNbCGg8f8zfcIV1bBgjzkZhTaHCtU6VTo0sWDtlM3EvTj?= =?us-ascii?Q?Oxo+NUlNZ8qU/GhAfHxnBNzPYMMHrwQTJFbNM+9+GxgjQdA+msnpozjrJchC?= =?us-ascii?Q?Rx4SRsjwN8Fa/o3C7YELEJVpkUxo5bZpkf4FbEPgXe2aD+s1ljqZT73kznEG?= =?us-ascii?Q?oYbA5XBoWI7XZy5VPbfJMW0DqHcM/4wrc1KEKD1pZEVCOPvU3SiNsCWoACsD?= =?us-ascii?Q?sPly04AbnvGt/W70X/leAQjN/EAJcd2IGdCbWkx0lRP6jO6nZo3rr0Y2efrz?= =?us-ascii?Q?lMq5qoyQDKBp+q4U5mqxesMFJC79wKyjldt5dNBUJZpnht74uOa/NIC129FA?= =?us-ascii?Q?+W/+6JWAd3hWtLhpLv6lz8VkOxWCej+/Qde48h7QFsDxZ4U5unpduyae0tFb?= =?us-ascii?Q?oMhfLE5kvOmIxfWrruvoHeYVzgd5iA1nFIy4VChkETshA92Cvz+rxxn4GLrG?= =?us-ascii?Q?4rnc1fkNZPQSjczVy6eKPFYhKQFuC+XZF2NcGQuUdFZS2GxotlaR63DHJjA0?= =?us-ascii?Q?b5XkxTJtXMrtJ7J/3O0y3VcMGiJC4Ol8NQiOVAYLoxzgz4GyK+gMr6i2G1Yn?= =?us-ascii?Q?ier/PXBRzVqFvd9PYY6QQGlgWBWzQc3IPER+e70VZDlk19S8/iueCebvRlAZ?= =?us-ascii?Q?CTlrAuA5pc1ctaOersARiJWMiEsc91ffLwlnI9RC+Tj4T9/R9kltm1BQaPNq?= =?us-ascii?Q?9YQ251vO7eJaW6Xp0GRCUJLNtnHdSbk68f0k/nvtU/W4NgzwJnDIoY6Mf6Iy?= =?us-ascii?Q?3Sba5HkTdam3R6ONQuo4IkjU67dA4+VwZphGBqqCZJmKpz9aBqivHeRbdMEY?= =?us-ascii?Q?R0pYb4ISv1m5i0calpugUUq5GP4G2mxBiQYehckB2chJKn5kV9vyaLqQcMOq?= =?us-ascii?Q?fyUxzhr1FVRSi4/ZtJW7yevJn0HGVZgy1SDII6S6l6UgPhO4JuYQvnQVkSHH?= =?us-ascii?Q?TMpytWTEHGUFy3kK4Frz5hUiXCVuco0BAeKqTYKugJYS/zutff6BPMnZDDPG?= =?us-ascii?Q?X1Rl1s5npjquaw+3D4UTaTmOOU1r7IeM5E/cO0XlQ4rTH6u4K2EY1060wF+W?= =?us-ascii?Q?QA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Om/ivGc38KtIJ3A5+J3HaptfZ5E2+NmIbxyRzAxjTathN8yVWXPkGSkqrpm5?= =?us-ascii?Q?XwPFTsOthaQVm1wnkq7bhVkJbO4wxtnvpRMam38/Ujf381gl0Sa5eqw5JvaB?= =?us-ascii?Q?SmPndroTmEuRnErk65j/iMXEwfyezzaN9dVOpi23Pz/xnMgHuqKmt8DwNrcf?= =?us-ascii?Q?XB/gln0l7IB8Y80qmDTGuSe0REeoLDdslGMbiMRRJxQm4JJRnyOyxvib52aA?= =?us-ascii?Q?lts3TlFJo8ARBAJY9PUe3xvwJtZhQdscQ1Ffvr4qOlo3x4XlKOjpe3vCoApK?= =?us-ascii?Q?cAC06JE18UABkMAI7UJQGU98PbRNL+1SgEgDT2NHnxAGEFttmkYgXcxUQhxC?= =?us-ascii?Q?FEnJq9FEbRquZjw3xXYIvSN08E/9x0sk0Fy+EJGYqk3RmB0Le0uZiNlZDwiE?= =?us-ascii?Q?wLZSEi7SC92sn/c3Xq1UKS1II9oaUr+vQky5F6h6pY+cWUkNNv/f+GC52Mof?= =?us-ascii?Q?ib773U+Gw0VWIyAkflMPeeKQJtgCan5YxxfMjHYz1nCo1gVfWzeA8LsES1L8?= =?us-ascii?Q?i5Rr4Mv8I0cMZaIWV1DIsQj+CxkOotsMtgrtfmWynMMxR1odwn0PSPKNvZaa?= =?us-ascii?Q?0LtvVIZ/o3GGkwtLgzt0fo9mQ9tSnksA4omTWtIT4bQiPsCpmCQFiRjYsyoQ?= =?us-ascii?Q?4WU6HENRoIdxPP/NIskAbolWpY/g3bRJ/9WUICT5j3rneCP2xbQBkOIhXwRo?= =?us-ascii?Q?NPH+4BTU/p3/VRzSQuwLqik/6/dRwMNI5I/+YUSnV0amhoRVUMY8YVE5ihZn?= =?us-ascii?Q?LAw66sTitLQIXLklpyvIPLaK5dqB3Cwd8W07GTeBuZcTGiow0zT5stoNjYgD?= =?us-ascii?Q?r4y4HkAXGoippNDVfSTEVUzfhbbrjudfyuY++F0mUImf0LdZVITaek5P42U5?= =?us-ascii?Q?7a93kixoSiRYoo7jArxmwRCjbytA6P3bvkwbTB/iXcpUK0IWsndC7eWbAqir?= =?us-ascii?Q?gnE8nNmu0QIoDJ1uJY6l1cmVjPA+fcht86dRt+KEXXxNoo+2C/jEkX8b74uI?= =?us-ascii?Q?wz3ndUXtFt3DFK+Yo8yKhs0Cj+yW9unfqWOFzkV+Lf15VRlmQQIH3PO33j+m?= =?us-ascii?Q?gxBel3izEAo5CTkXCDa/sVIznGXV0efBtKQKuZTyiohCCiDt6hkrwfLqLEKX?= =?us-ascii?Q?vPRA2a3UnM5dY3i8uL78uCNXpqr3CRVUdpmawzJhZoXVPOk3HEwkllDyAMq8?= =?us-ascii?Q?1nMwhxL/Ls0LUhOhNPHSo8+rmg/Fhr/qzTwBjXwANsR2emSyScT7hVseT62E?= =?us-ascii?Q?kfq+a/Ql5+ldbqa7rCtrpYLDoRO3GBXAldW395U2owuVxobVo/HnvAbS4xy7?= =?us-ascii?Q?Tnuuk9TsHf4eaEQs9Ywt4deFKdrOlCgH4Yfs2LkNwpoFKgINuR+KkPOv6XVH?= =?us-ascii?Q?a43o4HXugP22cUbUnceW0nY01qpffGYxLqv49jROhgbna35Z/mWhLtiJ3/K/?= =?us-ascii?Q?Rw4EOGEtHpkFUTKpAKgoY9aLYpGrG90Rx3NS49y2LY91vURnTCdQlyPf/7+f?= =?us-ascii?Q?xfKBce4wIVK6LlDPXKtg8lO5fuzvjOiGcZKveezdkVHGLRLA5+BQsyaJkXa9?= =?us-ascii?Q?mcwCnP0tZyexvFYQcmNVLeVr1Z1Yt4wMmZcJvn3ZvjhziOacmi7T1Z6pRVg7?= =?us-ascii?Q?kUjDaiWjkAjAj37mWNrprXD0qOooKqf2i+9+WKziT1+dXtBWfOiArKxAJoMc?= =?us-ascii?Q?+WYoTQVlWDqz/gTarSTLi1Tj5Cbwh2O3mY/xuM7PNcLVSg7P5wGgbaS0F62a?= =?us-ascii?Q?u6mcHoU2PMM/WApM3Z7PxvKZR1wrDF1b4Q0DcD2KaSnQEC4Iw5lo?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: a299fabd-418f-45ee-d3f3-08de56992d04 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:01.9174 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: QdQ7jLsZlxFLvX4MedeluLVtXjWK3aXOlEHwtYzJCTfNNmeLz21yNbyJ12FSqklrjMfh8rwEGGkqVpbumg8NGg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" When multiple NTB client drivers are available, selecting which driver should bind to a given NTB device becomes necessary. The NTB bus match logic currently has no way to force a specific driver. Add a standard driver_override sysfs attribute to NTB devices and honor it in the bus match callback. Also export ntb_bus_reprobe() so newly loaded drivers can trigger probing of currently unbound NTB devices. Signed-off-by: Koichiro Den --- drivers/ntb/core.c | 68 +++++++++++++++++++++++++++++++++++++++++++++ include/linux/ntb.h | 4 +++ 2 files changed, 72 insertions(+) diff --git a/drivers/ntb/core.c b/drivers/ntb/core.c index ed6f4adc6130..404fa1433fab 100644 --- a/drivers/ntb/core.c +++ b/drivers/ntb/core.c @@ -56,6 +56,7 @@ #include #include #include +#include =20 #include #include @@ -298,10 +299,77 @@ static void ntb_dev_release(struct device *dev) complete(&ntb->released); } =20 +static int ntb_bus_reprobe_one(struct device *dev, void *data) +{ + if (!dev->driver) + return device_attach(dev); + return 0; +} + +void ntb_bus_reprobe(void) +{ + bus_for_each_dev(&ntb_bus, NULL, NULL, ntb_bus_reprobe_one); +} +EXPORT_SYMBOL_GPL(ntb_bus_reprobe); + +static ssize_t driver_override_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ntb_dev *ntb =3D dev_ntb(dev); + ssize_t len; + + device_lock(dev); + len =3D sysfs_emit(buf, "%s\n", ntb->driver_override); + device_unlock(dev); + + return len; +} + +static ssize_t driver_override_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ntb_dev *ntb =3D dev_ntb(dev); + int ret; + + ret =3D driver_set_override(dev, &ntb->driver_override, buf, count); + if (ret) + return ret; + + return count; +} +static DEVICE_ATTR_RW(driver_override); + +static struct attribute *ntb_attrs[] =3D { + &dev_attr_driver_override.attr, + NULL, +}; + +static const struct attribute_group ntb_group =3D { + .attrs =3D ntb_attrs, +}; +__ATTRIBUTE_GROUPS(ntb); + +static int ntb_match(struct device *dev, const struct device_driver *drv) +{ + struct ntb_dev *ntb =3D dev_ntb(dev); + + /* + * If driver_override is set, only allow binding to the named driver. + * Otherwise keep the historical behavior (match all clients). + */ + if (ntb->driver_override) + return sysfs_streq(ntb->driver_override, drv->name); + + return 1; +} + static const struct bus_type ntb_bus =3D { .name =3D "ntb", + .match =3D ntb_match, .probe =3D ntb_probe, .remove =3D ntb_remove, + .dev_groups =3D ntb_groups, }; =20 static int __init ntb_driver_init(void) diff --git a/include/linux/ntb.h b/include/linux/ntb.h index 7ac8cb13e90d..d0115b0bb14b 100644 --- a/include/linux/ntb.h +++ b/include/linux/ntb.h @@ -431,6 +431,7 @@ struct ntb_client { * @ops: See &ntb_dev_ops. * @ctx: See &ntb_ctx_ops. * @ctx_ops: See &ntb_ctx_ops. + * @driver_override: Driver name to force a match. */ struct ntb_dev { struct device dev; @@ -439,6 +440,7 @@ struct ntb_dev { const struct ntb_dev_ops *ops; void *ctx; const struct ntb_ctx_ops *ctx_ops; + const char *driver_override; =20 /* private: */ =20 @@ -1770,4 +1772,6 @@ static inline int ntbm_msi_request_irq(struct ntb_dev= *ntb, dev_id, msi_desc); } =20 +void ntb_bus_reprobe(void); + #endif --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020076.outbound.protection.outlook.com [52.101.229.76]) (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 DB60533987A; Sun, 18 Jan 2026 13:55:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.76 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744527; cv=fail; b=mwVHURO6ooVbe8y5L/raXl5nlGwYf83MtQ4g61CCqT16+EeuIm9dXuEfqEyNU+l7IUfeYJcsqr2n7C+MRLVrRa345a5jxPApBtVtb2L9ulH+Y+v0xSbmgC+SXb2GSA364A5bCkEe3ghxniuWk6/rOobHm4mksCroA38SyrJ5zvQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744527; c=relaxed/simple; bh=ptEkiguE30cAc+dA8r0kK9F3SNAx5uW4xXucSTzted4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Pijmab1qCoQBOPd91WkhLaNHgh63jfn2946/Om8zv5Y7uv2jHRUjT5N7wLlRU0Lw5ck5JQH09c96qwDYFMP8IFM1sXEfnLGhan2f/qVRuzi4VCr308++TwUogPdrcYlbJBAyeZRbI+uKRHV0xkqIjGrH5LZ2EeGKT9Eb0/V5b10= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=XV+xOMSU; arc=fail smtp.client-ip=52.101.229.76 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="XV+xOMSU" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TtnIiqHUngsSUhj/QWfk8jeDc34X9/rEy2llFWEe3tCE2+Eovi3mz0tEkI3xb+Wzlv0ldYFwXc1eoToBSvPa5R0llFLjEK8oPlLcJ/Ir8FLbSKQGUYb/xOni805bi9WPhSbXbn+mjkKHGI9XWcMfyZQrLhyfG50LlfVQh8P43nXg1F9OCnv5drJC3RAf6R8f4Akh8dRfc79BwSllI+nKqbK7pLqKqDVCNUMNLAAlduNUcgnhlWz/R2DTWGy/RElepae8xvGNJACm6H9ErsqxrkIcPmI+M6N6Eh79pOFwbzA0UM6ei931B8NRe/MNVWJTrxq/RI0c5z147yqEIIxP5g== 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=O7nQz2U8e8YtSht/Yh6qbw6d/tWpqYajGnDsJGGdX4s=; b=S2e9z5gJeJv/hnkGZ0zgQoKvWFYQVj7W3zbpgkN0L+etL3A04JlrB2hFn149aWfrNAqP+nm9eVBAz1G064ovowvBGOOYhTeQ+e7ieXjFO+HiEA6xVbF81pEQ0Sr5Shk7Yw/8p+Yq+xAlcDg4qQri0+ToxL3DvDlvYQRj9FI1B91PyjJ310rieRSgrNGf850N13wFaStIveJB/i7xwQ613gREQY3nzD4hvpteRyK+pU4e4TBDg0Bt7PtnF/dlT2oiSgVdKk9ej7tT/kaJ2foJTSzY1MSGl54JryCqaV7GNDuqo65haA2t124dvnO9/ADM98g8MANFA+qGMbm+KeEueg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=O7nQz2U8e8YtSht/Yh6qbw6d/tWpqYajGnDsJGGdX4s=; b=XV+xOMSUvWZ6f6NJv3pAycE6kLYP+Vl3etzLzBvOlmfIpEKrrOCIvp2fNr+FCxkb8I/cz+qsDqtQVOufyRZ/silaUWka9cfpN7sPF7qIUKHlmu6qDX/WA+usfjK7M4N1VWqbJSmgkScdu8ufrjVBRb/H5t3lkgIrGVP3ZZZMJ5o= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:55:02 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:02 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 13/38] PCI: endpoint: pci-epf-vntb: Support BAR subrange mappings for MWs Date: Sun, 18 Jan 2026 22:54:15 +0900 Message-ID: <20260118135440.1958279-14-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0095.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2b4::18) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 66f7efc4-5fd5-4c5e-b1e5-08de56992d7e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?XCqLUIyHFuLT2VmVyda+uMlFJffjO+05wiccw/daXgs2sG+PuidzsVI/CtRS?= =?us-ascii?Q?4fIW0Na5hsq49VEapwH00mqcAYuqgz3Db/neAtnKnhqq7NbzMZCcsm+bhzZ/?= =?us-ascii?Q?0S2ynl44AS8zBgVeLTfI8+6K/SrkeWtGdMk73mKkwXt59d3t25vcjyRdbD0u?= =?us-ascii?Q?xdqVWhvqX1GiaPPv3Vak0HxnZ9+CTioixs1S0noSO59fN4f0iDCtCHc8fHol?= =?us-ascii?Q?beQYM9EjfUAmxbY1vSR78bh+9aKZIlOjDu0ewd4UOk1WCJgkQFRjqg+XnFGS?= =?us-ascii?Q?mSoiZxyD4Agg6qB9IiTXoHg2WnJzqBfB6JAcoRsGGBlGYM9FvLc1MMQ/AREj?= =?us-ascii?Q?hu9A0uYHNqzpI5805y0M9fYEn2Yyd+ZpBaikXnvKHqZn5DfZI4UcT+/rQEh+?= =?us-ascii?Q?RfjgrvQEr9hozSitp3gv6L+5lpZCbr/YCYjjM2ZTREylRq4shSgBz6noKS+h?= =?us-ascii?Q?db5so+KKXQaqC+kYR+7UX2umEUsDpW0S1ty/I+XO3XJ6QQYHTt3ktfG8H8f9?= =?us-ascii?Q?hB5zLwRsK2L1SCg/H86KshAYUU5BpJUFJBbkQJyevJfzLtciSKUb9jSqiBnH?= =?us-ascii?Q?e95oJu5uN4xhOyZTJhnJpcggycmBMAlnrhVQSsZHm1gK/2hfLJA2Iq7o/Odq?= =?us-ascii?Q?vyMeHgmHBfmy1wR220f9n6HT7KcDQ4N3RWMnU1XZqBohcM7biFgbPIHD+214?= =?us-ascii?Q?lxLCsNChxaS+PSpmmmrH3kw1EuE81mVgLHMQNHUxXSahIaT9HhUVPhtqQ/G3?= =?us-ascii?Q?Xf/r6Tcz5CnSfE4ZPOU5TaGcXjxC3VuqXEE9TFRNevWief3Z498dI0opD2ft?= =?us-ascii?Q?s/WmkTYUDqmTszYrAmIVv3paEzOmLkB8ahCod1LYHvenj27GRy7jWRJ9htPH?= =?us-ascii?Q?FT8iGTEUA/ek4Mks9SRI3khjMzE9y+fRiFsX9vKAEj+pDxG0hLmO2KxEtOE3?= =?us-ascii?Q?3lLjDce+39oN8tiLjbJ7ZwllcLoVkHcDlHV4fs3JjwXoJZvfs0fBtlTeRvgp?= =?us-ascii?Q?6r9ma8WiXeJ0J5Q8MJR1oS4MY5Zk09XIH9imJwawYbuLnqS+hHM4bs8dDRnx?= =?us-ascii?Q?IsvadK0F18ldcWPj8rAPHeZu7rPRr0DIOxAeIQbxM9KGWCO6fIEV5vPgwYuj?= =?us-ascii?Q?/JYLSF8sw+k6457O0vWvBJa4jLQVu6LJhp6qUJzKzL3WccqAMGsMQQMMkPp3?= =?us-ascii?Q?mlnsBcX2PqN04RSspCbznjb6DQb2TyMvJOWmM1uJJoNrcxydfbbizGXswCIK?= =?us-ascii?Q?GUyYYJs5XXcE5jyKTPRksm8nf81EvGmnconvPuR0piIELKqvddgWK5gWqtsW?= =?us-ascii?Q?hspaTntgBcwqZUSClVpooXJOLk6Jh0WSnpwJ1YPoNGDrF3ukISxTb5wDGJp8?= =?us-ascii?Q?YdNnXpKVENviPc/nvuDq/hC05ChUCIm0v3D/sbcdJRkgLfJkIW4eeH4bYlHp?= =?us-ascii?Q?rQsZkaXFp7MZbiAcx6zg6bBYIMblHh6L760p/pYj626TsKQ9ygV7+N8gfOe/?= =?us-ascii?Q?IooM8As+W76zIYaVAIjiTyKW0xc33UkODhbbKF30p4xlFV9q1MB9498n5thJ?= =?us-ascii?Q?Lhij48vGM3yZ/vFnEps61kJKQkO+LUEGOIuEGUek+E9yw2lDPKXxEQKuuskc?= =?us-ascii?Q?mQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?XZtCSZZu7ElrTmuPuD1drqSuv+/67h7bsnYXcmRLoCmZpOxRsvZZ0LUOUrz3?= =?us-ascii?Q?2bs/eh9fKSvfRxmhO9412FQkQyGMuHv4stB2W2hMyPKMtHNLaarxDYlG1O30?= =?us-ascii?Q?UNaKxuyC/9Du0upzfoLR8cYSjvjIlpPqPTthM2DM6SVMVk3I1z0myK6J0ZM5?= =?us-ascii?Q?GHnPFgrBt2Wo/VLyL1rt+AuZ6HWnGYhfAEPORa9G3I2c912Rpr7c7bEhbHgd?= =?us-ascii?Q?FSrfm9YH45vMZ+tZNyxeZx40nvKIazc3e9paqj5BrrgXqqBNy0QJEBpz0VQZ?= =?us-ascii?Q?K4yftdBkxx54YJKTKcQpstt0BKZ6QugrOiwq6jdEbE8gXCdS4Zrbr0xJGooX?= =?us-ascii?Q?3kjIVC59Wlv71mXaPDz5pz3zRfZyZjX+CnAcPGCFe7TkDLYh8pdIMwl2o8rS?= =?us-ascii?Q?CCiTBuWQRb5mV6VhP6D682ot0zQC5OZU+WXr4hcjGprxXiqieYN/h5nk9mUw?= =?us-ascii?Q?NGlBnYfS3kk1E9KXP98dYWuEM0NDD7zwnnkgp9a8Qr12TTTXWV3GOpmIeRIn?= =?us-ascii?Q?LOJh8GcJtOGt/L9/Zn8dtKGaprODHCEmpNVWCCl1/o1lV2I2ZO5s04uIw/PP?= =?us-ascii?Q?WX6573B14Zp5D4A1GCXIvAnbbHEYvbJZ4lrxf89x1ZDRiCfI6mm0qVKoZRgg?= =?us-ascii?Q?KCQ2Q4cOBWjLN1O5hbUXsvbvYedMZfaUEFQhLzjMgGHpaXKAn2nSwJs/sgmO?= =?us-ascii?Q?ZTFXpfCgKf8b8jvyRi3MyncRmx2sLSAfXorm6Ryn8lEMMZ54lcVKDAmGwUwh?= =?us-ascii?Q?xRXuCZEeRmxurV4NZrAtTsJ7HybXKKi0IAfsuddStXXQDL3GHgjgcjFTRs20?= =?us-ascii?Q?KomBZg9HOnQWoptCVXMdMXRgC4xNzH8f6dLQ9i1Sy0MR1BwMaZhoWjHo5+CM?= =?us-ascii?Q?SdOG8bUXQt9moazyTaWlCWZmHI2EYiAQeUuZ2pxUD1gOuCWnXIk7cdBVZjKR?= =?us-ascii?Q?2O5o+zEQ1n3ZbIYXuCeTiFm8VzQTsAxXEXbejRCk6KQRdA1A2nso1rXrMwm8?= =?us-ascii?Q?hKpllvsCKdlqhKgExf+V8V7SNLm6G6Ot0zxlpjJwaQfAUg+Sy2RoAsU1pNn/?= =?us-ascii?Q?FOXeCcDEkXlyWNOMj9iMlyjhKJpNOfkUOmUw6LBqyZcNsAHkaajaES5bpsZA?= =?us-ascii?Q?fCGQYkydrlzomfYiOMskFqJDMhyTwVwxsV2qMualKRkcYN+xIl5zAgom0oec?= =?us-ascii?Q?1Z0aczeOy1RxitVB2S+wWeZ9zOdZT2vhU7hSX6aW+1uuIF6fbpqP3oFXs4X6?= =?us-ascii?Q?U9LyiToauj5TTyVw+GExnlUvuPAmtuJCv5QvrlpWqsRRO2cUHe5d2yISraRn?= =?us-ascii?Q?Bc/u2z/HOvmMULGLObQAsQa7LBzB1LZpfVx2hCSdWCNLZz4qZo0cbsZJQl4M?= =?us-ascii?Q?M/ZDKjE17mElcxZ/UmNKa4dAuGEDI6TwzfttNe1kVJkZf/E1XXvsx4qPbC7u?= =?us-ascii?Q?JesRQ7NxzAPyTnI4uLrrq1w5Qu/ECPQSGaLeH7OgVQqVIE4WafYKHvY6rbJZ?= =?us-ascii?Q?r14E2VqrrP6DkZxoX0g04bhFfK8bhHS3KcrfvQqxH1jS/9ULUceX55eEO8dP?= =?us-ascii?Q?z+qAYeX9ywF5pZ7E/n09Vt9mmK/VmeAa+HLbcUOMuyX+djGvV4YVERBVvrU+?= =?us-ascii?Q?rbH/kCL/utU44D9EcsY3DlYyrzfn/vgAJxBWTNcdUkOQ8iVOjvSoo05Rwe21?= =?us-ascii?Q?QpeH9f52npfOTobDpal/ffSUUEJYEDMbnyxkEnBXGTXQyt9xj7NiDXidtMBO?= =?us-ascii?Q?lMA4xlb8oABxSCu7UFm9nBzo8ROhIb2I5k9oby9O5uiRiMQyqty4?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 66f7efc4-5fd5-4c5e-b1e5-08de56992d7e X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:02.6834 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: GsXj88Y80hQ/YHaR01LIRjs59NRoYOTXq+7y1c+SbkLZyxIUcHuDitbbrhkQz6TktG8+Zy25DZJLCbl0mBDa+A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" pci-epf-vntb can pack multiple memory windows into a single BAR using mwN_offset. With the NTB core gaining support for programming multiple translation ranges for a window, the EPF needs to provide the per-BAR subrange layout to the endpoint controller (EPC). Implement .mw_set_trans_ranges() for pci-epf-vntb. Track subranges for each BAR and pass them to pci_epc_set_bar() so EPC drivers can select an appropriate inbound mapping mode (e.g. Address Match mode on DesignWare controllers) when subrange mappings are required. Signed-off-by: Koichiro Den --- drivers/pci/endpoint/functions/pci-epf-vntb.c | 183 +++++++++++++++++- 1 file changed, 175 insertions(+), 8 deletions(-) diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/en= dpoint/functions/pci-epf-vntb.c index 39e784e21236..98128c2c5079 100644 --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c @@ -42,6 +42,7 @@ #include #include #include +#include =20 #include #include @@ -144,6 +145,10 @@ struct epf_ntb { =20 enum pci_barno epf_ntb_bar[VNTB_BAR_NUM]; =20 + /* Cache for subrange mapping */ + struct ntb_mw_subrange *mw_subrange[MAX_MW]; + unsigned int num_subrange[MAX_MW]; + struct epf_ntb_ctrl *reg; =20 u32 *epf_db; @@ -736,6 +741,7 @@ static int epf_ntb_mw_bar_init(struct epf_ntb *ntb) ntb->epf->bar[barno].flags |=3D upper_32_bits(size) ? PCI_BASE_ADDRESS_MEM_TYPE_64 : PCI_BASE_ADDRESS_MEM_TYPE_32; + ntb->epf->bar[barno].num_submap =3D 0; =20 ret =3D pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no, @@ -1405,28 +1411,188 @@ static int vntb_epf_db_set_mask(struct ntb_dev *nt= b, u64 db_bits) return 0; } =20 -static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx, - dma_addr_t addr, resource_size_t size) +struct vntb_mw_order { + u64 off; + unsigned int mw; +}; + +static int vntb_cmp_mw_order(const void *a, const void *b) +{ + const struct vntb_mw_order *ma =3D a; + const struct vntb_mw_order *mb =3D b; + + if (ma->off < mb->off) + return -1; + if (ma->off > mb->off) + return 1; + return 0; +} + +static int vntb_epf_mw_set_trans_ranges(struct ntb_dev *ndev, int pidx, in= t idx, + unsigned int num_ranges, + const struct ntb_mw_subrange *ranges) { struct epf_ntb *ntb =3D ntb_ndev(ndev); + struct pci_epf_bar_submap *submap; + struct vntb_mw_order mws[MAX_MW]; struct pci_epf_bar *epf_bar; + struct ntb_mw_subrange *r; enum pci_barno barno; + struct device *dev, *epf_dev; + unsigned int total_ranges =3D 0; + unsigned int mw_cnt =3D 0; + unsigned int cur =3D 0; + u64 expected_off =3D 0; + unsigned int i, j; int ret; + + dev =3D &ntb->ntb->dev; + epf_dev =3D &ntb->epf->dev; + barno =3D ntb->epf_ntb_bar[BAR_MW1 + idx]; + epf_bar =3D &ntb->epf->bar[barno]; + epf_bar->barno =3D barno; + + r =3D devm_kmemdup(epf_dev, ranges, num_ranges * sizeof(*ranges), GFP_KER= NEL); + if (!r) + return -ENOMEM; + + if (ntb->mw_subrange[idx]) + devm_kfree(epf_dev, ntb->mw_subrange[idx]); + + ntb->mw_subrange[idx] =3D r; + ntb->num_subrange[idx] =3D num_ranges; + + /* Defer pci_epc_set_bar() until all MWs in this BAR have range info. */ + for (i =3D 0; i < MAX_MW; i++) { + enum pci_barno bar =3D ntb->epf_ntb_bar[BAR_MW1 + i]; + + if (bar !=3D barno) + continue; + if (!ntb->num_subrange[i]) + return 0; + + mws[mw_cnt].mw =3D i; + mws[mw_cnt].off =3D ntb->mws_offset[i]; + mw_cnt++; + } + + sort(mws, mw_cnt, sizeof(mws[0]), vntb_cmp_mw_order, NULL); + + /* BAR submap must cover the whole BAR with no holes. */ + for (i =3D 0; i < mw_cnt; i++) { + unsigned int mw =3D mws[i].mw; + u64 sum =3D 0; + + if (mws[i].off !=3D expected_off) { + dev_err(dev, + "BAR%d: hole/overlap at %#llx (MW%d@%#llx)\n", + barno, expected_off, mw + 1, mws[i].off); + return -EINVAL; + } + + total_ranges +=3D ntb->num_subrange[mw]; + for (j =3D 0; j < ntb->num_subrange[mw]; j++) + sum +=3D ntb->mw_subrange[mw][j].size; + + if (sum !=3D ntb->mws_size[mw]) { + dev_err(dev, + "MW%d: ranges size %#llx !=3D window size %#llx\n", + mw + 1, sum, ntb->mws_size[mw]); + return -EINVAL; + } + expected_off +=3D ntb->mws_size[mw]; + } + + submap =3D devm_krealloc_array(epf_dev, epf_bar->submap, total_ranges, + sizeof(*submap), GFP_KERNEL); + if (!submap) + return -ENOMEM; + + epf_bar->submap =3D submap; + epf_bar->num_submap =3D total_ranges; + dev_dbg(dev, "Requesting BAR%d layout (#. of subranges is %u):\n", + barno, total_ranges); + + for (i =3D 0; i < mw_cnt; i++) { + unsigned int mw =3D mws[i].mw; + + dev_dbg(dev, "- MW%d\n", 1 + mw); + for (j =3D 0; j < ntb->num_subrange[mw]; j++) { + dev_dbg(dev, " - addr/size =3D %#llx/%#llx\n", + ntb->mw_subrange[mw][j].addr, + ntb->mw_subrange[mw][j].size); + submap[cur].phys_addr =3D ntb->mw_subrange[mw][j].addr; + submap[cur].size =3D ntb->mw_subrange[mw][j].size; + cur++; + } + } + + ret =3D pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no, + ntb->epf->vfunc_no, epf_bar); + if (ret) + dev_err(dev, "BAR%d: failed to program mappings for MW%d: %d\n", + barno, idx + 1, ret); + + return ret; +} + +static int vntb_epf_mw_set_trans(struct ntb_dev *ndev, int pidx, int idx, + dma_addr_t addr, resource_size_t size) +{ + struct epf_ntb *ntb =3D ntb_ndev(ndev); + struct pci_epf_bar *epf_bar; + resource_size_t bar_size; + enum pci_barno barno; struct device *dev; + unsigned int i; + int ret; =20 dev =3D &ntb->ntb->dev; barno =3D ntb->epf_ntb_bar[BAR_MW1 + idx]; epf_bar =3D &ntb->epf->bar[barno]; epf_bar->phys_addr =3D addr; epf_bar->barno =3D barno; - epf_bar->size =3D size; =20 - ret =3D pci_epc_set_bar(ntb->epf->epc, 0, 0, epf_bar); - if (ret) { - dev_err(dev, "failure set mw trans\n"); - return ret; + bar_size =3D epf_bar->size; + if (!bar_size || !size) + return -EINVAL; + + if (size !=3D ntb->mws_size[idx]) + return -EINVAL; + + /* + * Even if the caller intends to map the entire MW, the MW might + * actually be just a part of the BAR. In that case, redirect the + * handling to vntb_epf_mw_set_trans_ranges(). + */ + if (size < bar_size) { + struct ntb_mw_subrange r =3D { + .addr =3D addr, + .size =3D size, + }; + return vntb_epf_mw_set_trans_ranges(ndev, pidx, idx, 1, &r); } - return 0; + + /* Drop any stale cache for the BAR. */ + for (i =3D 0; i < MAX_MW; i++) { + if (ntb->epf_ntb_bar[BAR_MW1 + i] !=3D barno) + continue; + devm_kfree(&ntb->epf->dev, ntb->mw_subrange[i]); + ntb->mw_subrange[i] =3D NULL; + ntb->num_subrange[i] =3D 0; + } + + /* Not use subrange mapping. If it's used in the past, clear it off. */ + devm_kfree(&ntb->epf->dev, epf_bar->submap); + epf_bar->submap =3D NULL; + epf_bar->num_submap =3D 0; + + ret =3D pci_epc_set_bar(ntb->epf->epc, ntb->epf->func_no, + ntb->epf->vfunc_no, epf_bar); + if (ret) + dev_err(dev, "failure set mw trans\n"); + + return ret; } =20 static int vntb_epf_mw_clear_trans(struct ntb_dev *ntb, int pidx, int idx) @@ -1590,6 +1756,7 @@ static const struct ntb_dev_ops vntb_epf_ops =3D { .db_vector_mask =3D vntb_epf_db_vector_mask, .db_set_mask =3D vntb_epf_db_set_mask, .mw_set_trans =3D vntb_epf_mw_set_trans, + .mw_set_trans_ranges =3D vntb_epf_mw_set_trans_ranges, .mw_clear_trans =3D vntb_epf_mw_clear_trans, .peer_mw_get_addr =3D vntb_epf_peer_mw_get_addr, .link_enable =3D vntb_epf_link_enable, --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021073.outbound.protection.outlook.com [40.107.74.73]) (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 D103B33985D; Sun, 18 Jan 2026 13:55:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.73 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744529; cv=fail; b=rLd+0/FQhhm5K9w3W5h8+MhoAWmy0Z3+12VdAe0MEtueaBSEMSLltmoLcI/IbmxS0fdOBXUQxObWvc2CrHJqbEcAtGcuxPRRSDPy4Y2p2Fpe+nl0qVcNsj9826PLnYN5K/vETVud36HGU2zy3QunO+Ny4jFnZ2OMBmtul9mN1E8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744529; c=relaxed/simple; bh=eHGcYnWMpcWNmyGmtbJ/eO054IqGulp9YUAaUu1nVys=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=A8UYuc+uL6tXo3jUY0Jsu0Mey2D7AFgf7iNQVNQdeeFg+RMOtOjR2eEZiF6fNY8s4jW7SuvROMY2030peulasx7tZAT2RsqODSxVRUCf7vGw/XP2AHVPJmJW6e3TvWRSkEuLgw28mz6nBuVObM8ejnygbaDaL0LYMpV8nIPqBU0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=ZAzBlEJp; arc=fail smtp.client-ip=40.107.74.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="ZAzBlEJp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=YnYQZv/mYk63FYVqWqKEsIp4wX0skGUkJZHSqhLu9YzSIBDPXbka1+cCEvbhMrzssv52465Om0JKXsL4+jbK97F5JJbYo+a6qhpqpHFOnPQfEDT0VQ1c4gtoREXPWGoqg7iaiAo0BRmP6AMWrgv7xUrLF8xemLaUFfiK5AdTN+Jfxhq5j3qAPQyZEZOel/StJmXznYfSBPCJeVyWCUBgu9O/nDtIKfpT7f1EQO+mQa25tm7Hq5hfOL07QvePRMIiIghLDKrIdD18F5pDDxRqa4P7OvIeYhe99LmOVR+/LFOZR9zbbAQGn+kypR23VDcHsKtHheK6Qhmi48uo41M64w== 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=8bLtGOX8Lun2IgVbLvWj4aDug4JHPUcxjdb61TUfzUo=; b=VFC6ATrLSe67pzpA+uGcyxM+7NKR3xPehPHnxPqFGmUctqpS4RnfEJKamnrpzgwsIF+phiPq8O3iQ3tHCBepSX/8Rejttuy4HKnDN1YsYcCPArhSv548am5o3GY/nlo7RAFZcQXiFQBln1JfzJvYW9TThY/FaqFCiw10gZVf9afoApypMYJ3HgbXvUFA74J4utyt90FgLEuP/2sutUbNyJW5/9QJOTYYYWGlp83upoJPwmXQyG4BFYry/U6eUd/BsGylMc6G+RkWqfyjc78YHekkMqds6KQ7UWsKo+nZlk053PJSrenqhcnL7DfQq7TWE7Ik5VfiZswuZPfuUwdYXg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=8bLtGOX8Lun2IgVbLvWj4aDug4JHPUcxjdb61TUfzUo=; b=ZAzBlEJp0wE/ut5ZJL5+DW9SfN9Zpj6flLTotVEO0/Mfb3QqV0hU/dlp+jbBimFQNZwiTFN6K2OHxjm+/HyDvBK9uCji0Nb6MhamZ2DK5ii2F9pDH6jpp2JDi17RaBKE+P3ot8IMc2pQbA8FvmmtZLde9rraQjpKKCEUfa2/86w= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:55:03 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:03 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 14/38] PCI: endpoint: pci-epf-vntb: Implement .get_private_data() callback Date: Sun, 18 Jan 2026 22:54:16 +0900 Message-ID: <20260118135440.1958279-15-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0200.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:385::6) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 47380bdd-fe32-47b0-f3f6-08de56992e22 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?cWdCnXNB2WIuqV54k7xcdPWoa8BmYKR4NKJX+SiBpmeCeBagappl2JDvMC4B?= =?us-ascii?Q?riDovuHZDCOyV9f/XN7xSJgY08k7g2mYT6SIsGjpLyxo8Fwy/yFjQF4uvGch?= =?us-ascii?Q?OpV8jSklbnJVFqw/JsEVj2XpGC6gxTOHpAPb1wuwGl/4qcMI28pwDpATGJ5M?= =?us-ascii?Q?T7qelHxjGXuemUPsi1I+Kvp5lNGbbNGzgqCpbgXPI/Kjs3QRzLv7IOwriZ/X?= =?us-ascii?Q?FilG8aMlmS73RoUqhHcv75o7bj98oWIQ+h/4gFmZhztbo/UN37ov5BSJZSX/?= =?us-ascii?Q?Qsi4en3s4HQPbczwQ9tq/q1q20YOw4A8uTNUmY7HzIYUSHuo9L2kXBfrCqVu?= =?us-ascii?Q?eausAm5hxQINj+acxeQMYRsN/yxJEeEUENGf698vZfGd1QVzPjFMNcLKyhQS?= =?us-ascii?Q?6SQ3JCmXrplkmiCEamOsanzJCHOFlUjZrbHJQF44j+Rp0/S9SpQgdelOrXBA?= =?us-ascii?Q?Qvaaaoqm0QvcKiP31bpsqfa8JEyizVMm/xpUTsCxG0VSrb7XPDcBr9itlEAl?= =?us-ascii?Q?HVIUcABrYv9znlSn5fs/gRp3r1IT8VhDzV6td8ZgQT3eX7QTtAKYDPFpL1Nl?= =?us-ascii?Q?RvfNgJPx5CsfDVoRNdvWnUv3w5woZLK6Jvl0IP5nlCPuiRZMkwwSbca5zE22?= =?us-ascii?Q?3BOcPGE2+q8l2r+PIHk5F99w7zY7YrVSsRnSsQRJp4HMUoLlHadfT6P9OI95?= =?us-ascii?Q?+yC4SXQ6asu50uC4KkIXf+zm5RV5JXURVI640dYoIdpTIxk8o22rtsituWXX?= =?us-ascii?Q?0CDbxXIjmnyE/f5gX3Rq8S/Fvz/WxN/reLIuMa0VeuiFZ44xoQZ62GlB5ePX?= =?us-ascii?Q?Qt5at2vp+owsT1a+0t38ebJStw0PEg37wqL333TOyuN9yWmAHp0W6OsZ0svk?= =?us-ascii?Q?yvZAWdWeoukU5fZQGzFenYBtTRkl6vruHi1k0t6OGAaD7UozLkMVtrB0afEy?= =?us-ascii?Q?HAspFNk3V8zQ8mu+7vXMU1VECn1Tqzgndp3d8kQriLJqBsqm5bMFONRFUMNa?= =?us-ascii?Q?wQvOGZkJEdOSdBXoiliqdngBYvYZfkSNaSaSVvjT/a1pDPcvfqKSokkjV5Z2?= =?us-ascii?Q?WbBJreliWfMbEGmo3nRV7Y497PgHjIISn/WZe0mys8hIX5Jk0jeDpeuXnaE4?= =?us-ascii?Q?VWmuwCxald8Txmm3u9KQJnmylPJ6eDBp26p5dfrvHksnBf1mqhboIfowYoLJ?= =?us-ascii?Q?2mqHAL/KfgO9qZuPmysvHcR1bz0+Lt9cllgPZ3Y4OOKEibKgqNezfyaBc2+2?= =?us-ascii?Q?UKbDa6V8ewxrT23cXqtmBZk12vshXqIK35UzRhfdvVn53xw0bMNQcQ+Mxjv+?= =?us-ascii?Q?t40GwEEnO3x7idEfwAQ00EYIq6kq3Q+r8IaDJSLGAQKqc6zXIe+Gf/R3s8mj?= =?us-ascii?Q?HFYl7rLKuYXQ8lPip56/uU8PxhNAbFFED6FogcieMj6uFwAIHKezWrO6Kh6d?= =?us-ascii?Q?V+pyRqXa08mZCJLRHPcl+uKtMUClowRGRJXl2da55yl7lrNDNJd6h6otrroD?= =?us-ascii?Q?94Q4ndNem7LnoAr3kCC3gp706ce+Kw6GX34tg/xjfZpNUPxCUSnaW51anraE?= =?us-ascii?Q?oyQgEFhvP1cdcf/WlVJ1zAA4FSO6hWMIm3IgQZUS5Nxj8DekV07Bos1vRJDM?= =?us-ascii?Q?tA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ySeIfLgUKlbiEBtL3IA4P4PaVZsszhDMO3gBmGfdtF9XZ+aJ/1QJYNvEbutY?= =?us-ascii?Q?yvU11eYQ91xui9CIxspDeuxq0YBgy8k1hrdo8xCk5ReiFCEel2EasnoBxvVN?= =?us-ascii?Q?bd4cgVjlSelf+AHYYf5X713GrP0utHlbvi5/IWohhWoyEoTZlAygE8JhEYij?= =?us-ascii?Q?38aIza5GTqMlNpg7GKHDtZ6HtI7IvQfpkEXrE4u2B4KXlZSNDN6n00SRVLmQ?= =?us-ascii?Q?fRZHtDAFvXn9uC/KA9y+QGCrAieGWuiGJsQkUY5wh2LMGeoJ0yqDPchPNx3B?= =?us-ascii?Q?7m6i+zuHwuVDEve8G4s52YW1pgGaYVG/CH/pOWrQ0yCZTZcY9zF+urDDjz4c?= =?us-ascii?Q?h5Y8sGABszpoVdt6ve4OJRneh+4IhTg+y2D2hxtjMiSblyLwCAXbMU2wqHq4?= =?us-ascii?Q?WgC8Msg6TSb7nFZQV9mUbqHKqVl1bdv//GK8mcwf/IMIgrpUNqO4x2SpJG6a?= =?us-ascii?Q?8gt60sw7AHCc5mJzzo3WZ7RhBQ8UiD30aQ0/I6oAXVQY3zzBJxCMz4U/38Xh?= =?us-ascii?Q?bemFzI/y+8yGMZet2bpa/NS5VQ4as90Hy87hS33pUCx6uO3ydZdGbLjm/IuD?= =?us-ascii?Q?mzQtj0ztKgbryvxvp3akaEfJ4xgz0dDGhRvKTfb1ra9oImW51HJjYMEeefT6?= =?us-ascii?Q?H+lAtI6GwJ3uxNgsEuio7VhEkb9te+rHmgMZw5OLJ2tanNrYsmPrYJuu8dk9?= =?us-ascii?Q?OzIldMYdNW7NCGrjYroXuBYl2w5TqbvKg/N2jXm21WT6BJY1fiXD78WCNGsR?= =?us-ascii?Q?mVAgW8EA/QdoBtg+kfhhYqB2sgSPem/tz1gdH9tWbRipnYVRc8ztYqp2zFHR?= =?us-ascii?Q?cQzZdh3D6qWToAoVJbHh4jV32W4KGPcZWFObWlFQF8Q7qIVadE3SqbRwnViB?= =?us-ascii?Q?NXHM4MPXJTFi7Ge9zfdPuJAH+gUe/oWfpC+C2zXEOoVedCdGCApPiufKaEna?= =?us-ascii?Q?0mrJc7UAPul2W7n42AhmVfYaleRuZKAtrQvvSNSKMdSzFw/FNENmvyOuUjDv?= =?us-ascii?Q?K1r+G4ExPHmC2SVK5bHP1on+isr2PBdEF6oLOjasY2gBd5z7D04LIFWNOmNL?= =?us-ascii?Q?3N79woLFouRP+L1pMaI1J2roh9kF49Z2oZPp43ugItxxqhcXS/kaU0J1UfJ/?= =?us-ascii?Q?jctYnqzqunIanEaTyA4pU86+3zY+GPo6jYQrhR6Ck8fS0zsGcg7i4IfGlJqy?= =?us-ascii?Q?8WisSqilAZxOuxezf+n0gW4KcjwzMO4+nQ0bpNkI/bpxp3eUtxOcbOadim+5?= =?us-ascii?Q?NoA1rtm4Zk0BTsp8x4+pZ3PqFeBeou4lws8vuBGG082iCRRNDmFnQwMnPkG7?= =?us-ascii?Q?o2HPCxmqXKnesC6S5zfeFr9D+vqS0ZJ5sS/Pv9aOo9ivPzcrq+3MRuWC42cc?= =?us-ascii?Q?u0C6sHzaA+A2GNZpg2VojPPsgce3YsMDdzXfwIlSW06anHSpBZBMDy1Rwpmu?= =?us-ascii?Q?0pwcnw5ztpCurRGnM4/J+A4wsLTenwuWh4BoQ5H/sKEGr5ndzJb2zM0oSuy2?= =?us-ascii?Q?nUBvSOAvpOhZA3bc9Gj2McEd35hjl1hx25daQyP9IlGurnNK1gom0tr0O09M?= =?us-ascii?Q?TjYSnAIABEQ3miciiZDuttmril1MbMVl9PaBzx3yfNjSDwB1mNhTXONDQZ6q?= =?us-ascii?Q?OXLjbFPGyHkx3kbhPBe3tHt0X9nIDfVVNN5zB8USGdq9Na1d5QUzQbmNnn2+?= =?us-ascii?Q?ZvlBYMzQXC2L+gn6LMOJX5yrcVWRIStRc5pK5mpc5CXfEsMvE586YXCl9d3n?= =?us-ascii?Q?9LZyePcBkOR6NdIPSCVFJCszz/64XUJHIrT5hF0/9yg8YT7MWYDg?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 47380bdd-fe32-47b0-f3f6-08de56992e22 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:03.7581 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: jRPBkqQOMrWax/nZ4IeEwpBq1XU9anoV4HrfPCIeK9WIg9wlVcK6obRgU2JOCgeP3m4YHeAbkqVXVnCRZcd7Tg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" Implement the new get_private_data() operation for the EPF vNTB driver to expose its associated EPC device to NTB subsystems. Signed-off-by: Koichiro Den Reviewed-by: Frank Li --- drivers/pci/endpoint/functions/pci-epf-vntb.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/en= dpoint/functions/pci-epf-vntb.c index 98128c2c5079..9fbc27000f77 100644 --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c @@ -1747,6 +1747,15 @@ static int vntb_epf_link_disable(struct ntb_dev *ntb) return 0; } =20 +static void *vntb_epf_get_private_data(struct ntb_dev *ndev) +{ + struct epf_ntb *ntb =3D ntb_ndev(ndev); + + if (!ntb || !ntb->epf) + return NULL; + return ntb->epf->epc; +} + static const struct ntb_dev_ops vntb_epf_ops =3D { .mw_count =3D vntb_epf_mw_count, .spad_count =3D vntb_epf_spad_count, @@ -1771,6 +1780,7 @@ static const struct ntb_dev_ops vntb_epf_ops =3D { .db_clear_mask =3D vntb_epf_db_clear_mask, .db_clear =3D vntb_epf_db_clear, .link_disable =3D vntb_epf_link_disable, + .get_private_data =3D vntb_epf_get_private_data, }; =20 static int pci_vntb_probe(struct pci_dev *pdev, const struct pci_device_id= *id) --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021125.outbound.protection.outlook.com [52.101.125.125]) (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 428B733A9CC; Sun, 18 Jan 2026 13:55:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.125 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744529; cv=fail; b=ja+J9MuKm1Am2seY0iB+QLecEi0QNec3JibZOSvaZoGNcY/yavdygpBtyteGiOBEc7r8D3uKWhFWQkR0IOPSv2KowePHBVThbusk9h7pCZ2c6xH6dqGMF97horFbynOhrwtM4ur13XEk64ddDxTxmkkmjMv/At5pdEN1knAeAgM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744529; c=relaxed/simple; bh=cZC/Nw8fk8T0/NaVPVEHelyhMQr5Nmg41tT8nA3096c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ZY6g46OwfdleW/a0/g0YePf9vGegyxU8oDSJSCfvUPHwz5lldlraO5o2/+lLmCa0xGSFEGiB+uctInO6AvrbSRln1jQ5T37CNroj4rvjkIdyF0WMWIwo09ovyusN1J+8soo0Xiu2zd9hfYzENmGuSc9JYPRMNFcOggtCy7ewwNw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=lnpIaeiu; arc=fail smtp.client-ip=52.101.125.125 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="lnpIaeiu" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZdiPGLACaG+QuXJAN8JUJQ7qtTjQc57rk5VeqVee2u1jBm8dvKvxIumsuUrkzkdQKwRsV1OdVpp9+gIFGfQQX53dYT1eNneBTfYYwI+L7d24ZARiM9lh4hAyjmhU9rk/rd1KfONPfiGDEl3XrT3fF+pZ73y7Ps3rwIEkrcL+rDa5VD+qmiuBhw4KIku8yWsHiiNoecCMx+Xr7MsE6+ro6E5F16ygqGstrM7ifRoMI+sYt2hV9N9cTmXG7nh36PeaTkg4aiHhba0qxPDUL1bXKdQ4MP9WIzGST9Z14e9aveZHNxhjJiGxJUWBWcddr/5knIQWr659qPL8HXWMuRoWJA== 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=U33aehvTJOVrtOSkpfnhADG7GhQcHFK+N25Bxl1DX5o=; b=St0PSstAN0H1ljPDr0cOZ4C++bkbUhbj0aDgdc7Z99eB1ZKlStkLfN2B6pz9IQqsuBSe39s+atIS4XEABdPWDXIqWJHlhyWqDC2LN50G+AIZn76R9e7hS7qc9dJIOVKRkp6eM4ClLtRACYl46q7i9F0ScS6V473zHg/AMFjkOi4J2X+J8D8IBUyiOpwRbcyTedCIImecYksBw90dg743gKfAQadtKRMQ2rhMO3bpGhoNwMw0fgyyPOf1E5UeZmAEsy2zNk7qcWtyWtuFBEXT1Ow4FCEm136y+MOZK5qZgTthU73n+TbnBQRprKd+WIjD9FMYOXf4e1QENmbVbZorUg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=U33aehvTJOVrtOSkpfnhADG7GhQcHFK+N25Bxl1DX5o=; b=lnpIaeiueE0SmX0mFA+psU6olItJEcAwPkkddtfAU2858FDwe4zkor2SYwnQ8hVOX3nyViyv1Gcxaasi06SWO1r84DtfaSWNcnYgpdVlPQfu9Wa1cMhucsKYGwyl2W2W5UMa3KxivttDofWS1GRqqg7qEveslEO7OnzVHSqbFOM= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:55:04 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:04 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 15/38] PCI: endpoint: pci-epf-vntb: Implement .get_dma_dev() Date: Sun, 18 Jan 2026 22:54:17 +0900 Message-ID: <20260118135440.1958279-16-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0204.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:385::8) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 65e6e044-fac9-4855-50ed-08de56992e97 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ETU2+CRFm5i1Ryjjc+DxZmpbKJNIcMfaiOdntj7s5cONkKWzSE4vZ+M/5ZlQ?= =?us-ascii?Q?03djsYPfzazc1tFZdI7ED2pQshkXiiRBLfZ2CRjiTnt9L6DYcQmWAXU7ZDUA?= =?us-ascii?Q?y40pObsh6aRUY75l4FSaVBF6On+UYXmUjW3eCAtWA0uulGYJvkZeuwsFv8QZ?= =?us-ascii?Q?UpDSV8wZ6xybaPW0Bs0Pz5eAqJFh+VpYkWofaTjldd/ZRsS/6Vx2+3ofMB32?= =?us-ascii?Q?EVq1Cm6W+muMxGRJ+kXDtJhfLxINz1P/pBkYuxlhSgERT04u7PlI8AaNMOu9?= =?us-ascii?Q?crM+aNjynEG4EXvskLdfR2/VScHt+x+6urUA4z5FTIV6KXA2pT97xidgFh1E?= =?us-ascii?Q?uw+PUWVZJ4pngT0nr8+yt63zT5V1260yeKTKVAtluD0aTzDrq3jJ2uXVqaVT?= =?us-ascii?Q?sDhdwZJt0SLejAc0MtgRNRRdztECh3dP0QY2PTfxK7Jb91PsBFdOY0X0dus7?= =?us-ascii?Q?UfO5KC48H2jp/x4oEIpDqUGh7mpaW/zerchT8qyTlvdzlIkhADyopXLjNG7l?= =?us-ascii?Q?y7ys9ouSOPK358qKwN2F5lr+STDMqZKhmGqUgnWTMHej2R0N8/QFyAlKqvUQ?= =?us-ascii?Q?qudbtCVfwnVVDU5gHJEiDY7FIzu3hcV58OXiK1I1uXWQID9rtVgviUAIJpSE?= =?us-ascii?Q?jRDhMlhrw74LQkHc0hb0zmhgYUY/a9eJyuL7hPJm+7Pf8BuEokAJR5XIWGmT?= =?us-ascii?Q?72aTnDiru75Uj5rjmiQMb265BKWB3lWmEvs0HQz8w5lE/Vcg7l3FYtoCguxt?= =?us-ascii?Q?8lEm4LRzQ9092pz2fvZKiqWky8wyxn9Vc5oUQAbBo0cAW4QpbqbjXqaR/iKI?= =?us-ascii?Q?9nW2hMj1j2KrPtJPbl8qyxvsRWvPJ7ffw3QwCdMMAFTryV6kmNuHmHRKOHVZ?= =?us-ascii?Q?JGVBXQH21gR43L93t+lI8w1nkm5ETmGPtq+STNgVEaYmakKXovPwOmd/AUg9?= =?us-ascii?Q?vmiUX6CwscJFSREBbOUtpiqSdp11krBDyDaBCc9lG0GJ0DuXKDDpO4QCLqjx?= =?us-ascii?Q?orsY/FnhRsXtNPvFKgd5bePdnOaEFBMhMETX7p5PCTSb2Dc0Y0zWS7i2bPeq?= =?us-ascii?Q?znYXN9Mmmlc/NH9niyhRe/YmlW/sQTjOpe8L/gJVDDAbevf9nxpb9mOft/lE?= =?us-ascii?Q?1qiQnK5KrvGt10xiR6Sgzi25/eiaDWbLKuhYVl/zY3qDaEMQ4pohAMDh0Klx?= =?us-ascii?Q?AEjh+igEAs9UdyGYD0TPmBbg3qNHfTEM7ezVBxGz7K0B+DRz0+VgPbZ5/gCn?= =?us-ascii?Q?zGKzXK8ibJ/KAyAzMKisYbtXZtDrJrOh4MObGBvvmXC/GuijWf/3PL0M25EV?= =?us-ascii?Q?KKKBDk2gIvU/RFLM/PgaYjCeppUIgo0l+Qed5xDnhgLHQkCETvSV/XK7BVQR?= =?us-ascii?Q?Ljm7hHispunfthZYXvckjvc/Z8mCjC27nf5won7OCwYmGtUG20M61TrhHR8x?= =?us-ascii?Q?cy8xu8vh9YEcJqDRirTPU2TuIOYKMJaXCXzyambjIAhv794+PQymjcymeiPT?= =?us-ascii?Q?yIjkrNqEHfSD3xaV0JtuxuSjLqcEbeuxDCX+hwFwplvg8YzTpwZWklF7+nA9?= =?us-ascii?Q?wSkjTJctsQRRzmDndb+givtB06hUmoOB6Sgv+iVVMhjvWYNdlTeLNbqMh00D?= =?us-ascii?Q?VA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?+KrN9XRP+ucVIa8b3B7MTlpkdsjjaq7JW9TrgVHwVHra+RHg1tHc8gnIWpv1?= =?us-ascii?Q?UK4+zRYOCd8VWDtnhxoT7pjaGwwXDw6B4W71CAk7zCvuBVtexalF+aK7boex?= =?us-ascii?Q?nCEiYClCchLpFaN416aI8oPNEtkvd+kzJrXQRlxzQNar7lkTPFGv8NyR7B3H?= =?us-ascii?Q?tvy/lAy/tgksdn29Wf3ef4Eg95Q/Lofl9fXzB7f08oNKAihwn5PG+04MXckj?= =?us-ascii?Q?5fLoVX+ySUeQcEf5AhwH6+1sOF76Qz8QVKocnY26qQdPUocMLS11D3o9YVlz?= =?us-ascii?Q?ODSj4qoNOVulkLogVp0un4nUZIBxm4ugaOMkT0NiWjOEBi/33HRR33HjwJgE?= =?us-ascii?Q?nN0TxJSR1e/GL6xLEx1+yaL8tJ5QUTmdIsoFs37zoS/tMqwOYsrWzPFJMQRf?= =?us-ascii?Q?k9Ek9Ae3HYBF4p4wwIiFs3nbVjap4xtXkQinH3CGZx4byQH8E7e7UA6UC2gM?= =?us-ascii?Q?J5ZNBXh2H8RG5fc1ENjoV3iHV0XsWthwRqa7LoUCoQuihEQRYYUnMrBKer5M?= =?us-ascii?Q?HnsIetyClXpwG+CLpxVMyLOhK6iaL/iukcP3nbRG5rXA6Uu4DNQMYFjvznX1?= =?us-ascii?Q?Blh3LyRwoNXPKmKvoF0WETqYxA2lnQqphTSoi6seNS9N3TNQfWH8+wpDOf0o?= =?us-ascii?Q?R8kESkZIXc3Aj+P9neozs9mdOCAc8ezAEZx4nZTkh0kJeFK19JX5pJDkDPEp?= =?us-ascii?Q?KU6FEh4PcDPv5rtZmjGe61KJBkotCeuhw8r3sEWhB8a1sezjarj62DV8rq7x?= =?us-ascii?Q?7JOVoEjcmiJr74BHOE7hG+WgJ0aS4Pbz7bbBfNWdLOBn8vXvUCmqfqHAOK2s?= =?us-ascii?Q?dNLHF67LbAdHzv8NeTLmXdZxcO0FDYVg2h/XgOHV2/asxhv29CLdcDOdH2SH?= =?us-ascii?Q?fr+9jbYYI5EMoFPcKVRIiKuuqbdB2moDtHUF1iLPDpuz5ZG/xfuBEuLmZK7U?= =?us-ascii?Q?PiPXPUqeMNWDcJOmEUyJg5NdsqoTFmWsKVSqa3IU3KCkT/2n1w7LHA/75jDp?= =?us-ascii?Q?DredyjKrqKp22hNK2GWzEUxkEwUxmSALLs9vijG28stFHyYe7YxsIOQmizzo?= =?us-ascii?Q?ChDoEKryBFWN+mNZlbD6+slo3UI5IFv/UhpZ/nJvYZEUvxYUigNC8nf35Qx3?= =?us-ascii?Q?myUMAi400IXX6rMpfaPTwT4EZP2GbNznaRTsahdcHvTVap7+wmAMaHijQFLj?= =?us-ascii?Q?jgHu4Xc8E/6Cr/IxZruFFshd79XP6FojUPkOvR9bqpI12GDCvEtJgRuQbi0P?= =?us-ascii?Q?W6pmv9Kkkq2nWVPflaRZM3K6vIemx19UVZEMg1CQM0M0GrAmLz+Dk34P1LjI?= =?us-ascii?Q?YpT+PDRZtZzFbQ89IYnShFJYrsc/KMsEWc5oAjl5q/JCdYG6I0v+gFRxc63a?= =?us-ascii?Q?9v7kZcUAA5ca5XxrK6tlW0bOmRAphgwPmvp3lFzpSwgjtOQzYkVEdgAmUOlg?= =?us-ascii?Q?TwDzV71Nr64hc9reftLKDhjs+xU2S4qKgMrqgsMt/cviMyusXNISVFGs0dhG?= =?us-ascii?Q?LmTa5gvmO+3GXDaidANezZg0/ZHrpTS+wL1dUeTCj+oelu8Sa0C3Nkq9SK7d?= =?us-ascii?Q?owuccPWZIOI2TyzId1YjB5hedgKSnpN69VaIiOvbOkwDAFCuhhZRabDyfwZB?= =?us-ascii?Q?X2aZWsHSIGz4GCO8Tqy3HXd1oPNdx6xfHudNmUdvNLGkAjYXBY/IXYOTNuxy?= =?us-ascii?Q?OWkiAd3Qf+sK3n/GxQGHYgd13KOUsKlPgtzFBK+LdzImDouREUqcHdIKJVGK?= =?us-ascii?Q?N/zx8tVqZMUru58X+EWNpuqvI1eX7RW/GbngGskNwGy4ERU3D2sV?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 65e6e044-fac9-4855-50ed-08de56992e97 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:04.5293 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: yS/C6DoC7ivV6iyQWDcEwiBxPM6OQccgUeT8J4ZWHkJTlC93bXhAcUI2/1rMXZK6LjKVA8Ziw7V4ArxvcJV8Rw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" For DMA API allocations and mappings, pci-epf-vntb should provide an appropriate struct device for the NTB core/clients. Implement .get_dma_dev() and return the EPC parent device. Signed-off-by: Koichiro Den Reviewed-by: Frank Li --- drivers/pci/endpoint/functions/pci-epf-vntb.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/en= dpoint/functions/pci-epf-vntb.c index 9fbc27000f77..7cd976757d15 100644 --- a/drivers/pci/endpoint/functions/pci-epf-vntb.c +++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c @@ -1747,6 +1747,15 @@ static int vntb_epf_link_disable(struct ntb_dev *ntb) return 0; } =20 +static struct device *vntb_epf_get_dma_dev(struct ntb_dev *ndev) +{ + struct epf_ntb *ntb =3D ntb_ndev(ndev); + + if (!ntb || !ntb->epf) + return NULL; + return ntb->epf->epc->dev.parent; +} + static void *vntb_epf_get_private_data(struct ntb_dev *ndev) { struct epf_ntb *ntb =3D ntb_ndev(ndev); @@ -1780,6 +1789,7 @@ static const struct ntb_dev_ops vntb_epf_ops =3D { .db_clear_mask =3D vntb_epf_db_clear_mask, .db_clear =3D vntb_epf_db_clear, .link_disable =3D vntb_epf_link_disable, + .get_dma_dev =3D vntb_epf_get_dma_dev, .get_private_data =3D vntb_epf_get_private_data, }; =20 --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020076.outbound.protection.outlook.com [52.101.229.76]) (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 A658133B6DC; Sun, 18 Jan 2026 13:55:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.76 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744535; cv=fail; b=UFwBx3y7wpeOqCHeKbz4IZ0EuB/e40Maw8vYcxK2qVpDsRgkXRz23/qrD7eC7esHVJIw7bOAZ1P4FJf06PlBYIjk49fTJ855szFhPZZxqE01yJ5uWX/yS8QyPIwox18lB+qCMR667Kjp7YnjBZjFUiYgEisMvnH+EZ7Z4KO8fnc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744535; c=relaxed/simple; bh=z18ROQcMPJgBSVybHegTyWysddPi51yJ0p2FxgN9e9M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=aLliopCL2HEbW54oL41YzydH18wjh9kizy7wcd6Q7OPQzo70RiCQS8S/EoWnztkCgE6Mkyqj1qrhArJxGKsJTjHdOb7HQcPTP4JDBIFP8VB1IQxt9SkxHJ8mK2KKIljd6HSP8rwEyCtUdFJqH1mwh4geBjlYY3Ijy2VYb1eXowc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=minxXdIg; arc=fail smtp.client-ip=52.101.229.76 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="minxXdIg" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ULKo0Es90/JugZfJCXHN4HEVIaEle6uMO5GOjWU+hhMz01FIKmeMkwbQbmsKEbLYKFysQAFu5TCLZsKrFCE224n6ExcmI2t3ctBbGVOAHmYe8RdcFuUt25i+kAQBAgWDeAEXjKtjnywhY2e1gnXGOqWC+7SlfzmivZpmYv2Md4089DofhYPFH2e6iVCscktYFiRk7NZ5BlkXqr2LaVjAX0zOmeooJ9yq6qRqW7+1FeVAzwOXYso5oOXKnma7VrKL9LXKqjA0GjLATBPc92oj9KDW3460nmmhmtBQawVha/SAH+tVfqOxmQh/Lreo1ZSKvtkQXUvA9EUc+Xuvs3v6pw== 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=tQKqqZbY3T2anGF07KqSQ40hMeW75pJ/JL+74TG32WM=; b=kGbbAJZYtcRrz5IPuiEiVQmqDk5fAh+VUdxhn/5ExukJ6Q3hxD9hN+xPcpVsay2cUH4oyXTMAtVYFcxXkokH+QiwGA7zQvEWR/UAl1OXBz0ltJE0k4ZyLZI+X0uuxxk4e8t0uctguFGCVhd8vRFfzDDq3jNQ3ynir/flV9rRad9xTEkopFFzYYQCJQ3KLoHX36g1Ny83xX8cO/+XQNbie3xb3Ruzo8Lx9qswPoZqHbDF7abAyAWERy25O+GKVgrym7nUaw7i9slYkhM9w/eCTceVPoNyIx1lhpjbboQu2KhKO+XlETU1NbwHG5oM7K2HJ4WetwI9NkZNWNh4HG9U/w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tQKqqZbY3T2anGF07KqSQ40hMeW75pJ/JL+74TG32WM=; b=minxXdIg5SMxozxzpDHrxK3yJRwbD/fAiFCDJfEDun22a9cYDsTKkHbfMherFFXLxOG9/Kd+BK3kGQWgDGh7tuU3ay+fxM2nXNOUsvOtwIuaTribz4z4twxE1rKz3j3pwk/Q13z6ir4i9R28sEZrpN59f2CAOvi4c2tQ2lK068A= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:55:05 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:05 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 16/38] NTB: ntb_transport: Move TX memory window setup into setup_qp_mw() Date: Sun, 18 Jan 2026 22:54:18 +0900 Message-ID: <20260118135440.1958279-17-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCPR01CA0128.jpnprd01.prod.outlook.com (2603:1096:400:26d::20) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 9c3d93ba-a5a9-4cf6-dbfe-08de56992f03 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?bAqm7Wn6Mj9hFDuuWDdrywJRIQcSYOTV0MDSJRibcinphnwsltPcg3QPfYY/?= =?us-ascii?Q?Y7IkTtQekn9Wt+VRI2ifwepGtoKzDg4fiNTaAl1TilMCfuU2cvbEslxATBkc?= =?us-ascii?Q?CqoFAo9cRywMXhMwnO62WqhJeFhnxuQWvNRKg+6rAw0T+j/5/HUk5p6CvLBR?= =?us-ascii?Q?tC/WdqArI3VjH39Q0/dm72/RV58y1wEqPhbWsj4Xj7gp2M5OU4EtKib21K67?= =?us-ascii?Q?xICvTxvnrSZC+6oazFr3XzzDDUB8wXa48Gug0DxuH/dIeoWhP6fYLgp1rqXy?= =?us-ascii?Q?J3IvKpgh9eEy9mmfWPZAsijNVVeG4p5hSpobIv9TXD+qWJTWzWbsL3ar2pIA?= =?us-ascii?Q?/hI1Fpu4fC1KcaI8M1Dl8HklyxsW0GhUSjtMA9n4feFtzKUsHm+GXB06dPet?= =?us-ascii?Q?wGVCkw9PvuwEabOzF/urgFAOBOlxC1RMlGphKfJ8nRoGnZM3N32OB9zJ6D/L?= =?us-ascii?Q?y08351BwIT2AYKD8YX9yr5ONh9SM9K2ii2Wxv+3f7fWAv3FWEqXCYN9NIcMM?= =?us-ascii?Q?2xzi3nseYoM39XpRvp6Nh9SoHTidu1YH8o9amyrUcHjabfAi8JQm6GvfMmDL?= =?us-ascii?Q?/1FzBVQWClMfTVfJlpXX+4mZTr6SJ/egxYtO0bc4DwlwRldCBfrhJuWYg0Bb?= =?us-ascii?Q?2G0cS3DEfQajz1y1P7G9SyXsApzZ8UcCtRAylJzAQYz9/ehFJ9xflZ3aI1mO?= =?us-ascii?Q?S5mVjd0mspym5b3U125tIGjtkd+e/FrvHcdHEFBsIkw6iZ13GeW2HTR2RmsV?= =?us-ascii?Q?ytz1vIqWEL3VadWXWa+fHAcRJysUSre5D/61OdKlAbyZFkN35FJurQkpjMCm?= =?us-ascii?Q?QFzmcBu4pVL0msoc8iLFK4OQMTRNdMiBy4tljIxUT54QjcnPdqCo8FS09o5X?= =?us-ascii?Q?ujGzHkPsXhkDdfnerhuSORidAnSrzvlIGTYLId4rqol+QjMYn1llfkIkB+vN?= =?us-ascii?Q?y7YvcFNTw+klMB8AmrGOmvuK7HPRPcAw68DuGWqD+bKGfSZJmNhgXQUfG7W9?= =?us-ascii?Q?alzAgGP1Q2nTuOMPke3/C036SM3DORd3emTBrK9q83WSao8XfWy/xr4daPzb?= =?us-ascii?Q?dWvU0DRPiOqd4wMCkMLiRo3ZTfS8SJR1igZgofYxqWKsYMeLT90jGyJlrWmP?= =?us-ascii?Q?TI+6LCW312CVweVy5SBgk1gDoI75rVFchH0/USlrXZ9emrpa7lmxCxlvukZd?= =?us-ascii?Q?fzdMbLUhn0Lq3X1jIA9IznzOkL3Xkp7ISZ+YovSXjX0ylDJgu1nxcTg0FvbC?= =?us-ascii?Q?ge3MAacDiirdQilAyBh3zJIXtnqdgC2KHWNjFm7DQt9tOFlN4E1saQCDgiTq?= =?us-ascii?Q?7lfu5W3BM+k+bb7XBlcQt3PFMLsJD5PoFV+CYPZ6cQyCLq9wJLUq1A+RC3GB?= =?us-ascii?Q?khn/vwI/RLwr55zNgel569mG3m74zxAuThojV1shBIA7CQtAn6fEDbT6re9S?= =?us-ascii?Q?Vn5c4Fs78SqnQewYAuyBtgE3iyNeevj3bBjWOMuphuy21te0w4ZWIFm09XEi?= =?us-ascii?Q?5nd2UDTiAXHL/Pbgrcr03LlTJaNVJfIHiIVgB5CI2iKO2P/m4kOdtqLxcYNp?= =?us-ascii?Q?kEeNxE0zi2M0bHAJPp6caKrdegRQ2wsJwC/6ZDjv7VckEk66ZhLidL7mSmQZ?= =?us-ascii?Q?8A=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?7/u6KbYV02A8cAtMVi6Oi+7wTG0UDD3sCQZ55UWmEWayupz5xqkT+o5BgpC8?= =?us-ascii?Q?KM/49sy+gurUi0FdvI8J2FYmCeBlqqScxTJ+BCcPIGktG/mHIJtDd6yKdmwI?= =?us-ascii?Q?Jm9BPWLkJNmXmvMPDFWJcCyPYR61SVnbxCsWNyQvniw5as4Xtqc5yFR18XSK?= =?us-ascii?Q?UYSwatLEfqVuzZ6Crf8ZZNtZIp7qXx4kJW0P5rb8JiA3e7IhHq7RXLt7RGJp?= =?us-ascii?Q?XKu2iYlDEhpZvG71Af3bWM/4fmaLaUw8MbEM0Vc+GLU2h3lfTOwdLmt7v1Ll?= =?us-ascii?Q?Qvai+avoxyJkUebeKBofSaI10728yvnpOYC7tjPL5M1QUr1XwcyoSh+c3CIj?= =?us-ascii?Q?0F1Nb+tF/uFNrHn5uiWbMVBJ897UL/H4LmV4/xpIXSDIz4MuZ8zh6oUqJ47h?= =?us-ascii?Q?hRqyu3ISOkO6xckwdQfnA0/r18L5PmrQ4Bejfq4F/bKGn6WXQtR3i/J1QYv7?= =?us-ascii?Q?me0OChyy0YoCDXqCKYhEhYqNjKj9PLkcqWkhBRlIpngG0kAQ5d3yQ8th3aaO?= =?us-ascii?Q?LcTCm9l9tIpPdoWVhMNIXNjatSGTRqh26PHJHywfKXdYGYLObNPsyt+0+DYI?= =?us-ascii?Q?6LtMKxWjMK6S/ZtY9/QaS6xLV40Fp5bVd3XYLM9nwU5DoP5OdzGEjCYEpG+p?= =?us-ascii?Q?yHtKyv0Sy+IdjZJOIllBT6piIDhhSksO7Rz+DoLNcIpqqM2Q+4XsXT1GdgGM?= =?us-ascii?Q?nio7rmV3F3Qf2GqPeaYn/J4zf6m8GcWejV1290q4/jRmH9txvrfEbODx/T1u?= =?us-ascii?Q?5Xe8Hks/J6GtQsTt6ENG0XIW86F6pc8/IhOK7vKWSwY68hRzMK1gaTHckDwW?= =?us-ascii?Q?c5xDd4iiidTd2wKDZ3X4APQf3r29boCZaO4a18q1tZ2DsNzf/8A6Z+LL20Bq?= =?us-ascii?Q?ZaBOCS871B8Ve3YDamc/nfvk1S3Sb5OfKzr08BQB1lwQMc0uoR8KKL70TlP5?= =?us-ascii?Q?XoO3dbgMq3Xp8LkmaFzoHCH4B/kTn1J59aR36pg9A2kc/jwuYt3b9fHehZ8m?= =?us-ascii?Q?2BrLuiXEb5KSEMYjDiA1nsPkLYIuTnNhpGGUJV6AeGXK92ioGsuKAAmAybWu?= =?us-ascii?Q?/FbarTbAqlY99JHbMniWQA6diqoLiAPn617avXrCQdx/IJpYTGK559Wkk/+t?= =?us-ascii?Q?7P46HwjeG3xW2vKKRwxsLIByTHrG4goVTpdcp9MpDg8Emf/9snWvSjxztOon?= =?us-ascii?Q?//+p9+vW32ngEL0AFJtDUQX4UJs9YOfEjFAla3ofTOrCAfzrnsP46LOpiNhb?= =?us-ascii?Q?wYWo7H5Onx1SXSky7TqgPxy1FC3RFehDBbTiqn/TPFOJOJUz0wk258pl/VFe?= =?us-ascii?Q?v/7W6vYSuizQxtXcGjnwVbo6XWBZYHMQFqr67EksfoeY4352OlL5OPow6bqe?= =?us-ascii?Q?ST5U+bJuim4tiePVK6L5EYszYHS11WONmn2B1ZubyFyuZGuizu5GybI7FiV+?= =?us-ascii?Q?lmMFm3xEyLFEUe3HwJ6t45Mp4FOHOVkB+itTVFTuW3IEITRKT40j+X4cRIRh?= =?us-ascii?Q?lJmM2n42KREvyjrvxNeRobsqNaTNpzYgxZ26Ia2P2tkjrP+JsWl60HQN4xaT?= =?us-ascii?Q?kc7skWhYCDne/lotiEbWXaCufhTHdIFeDmBAudKgH/JWDia5KOYbdxFwb3xI?= =?us-ascii?Q?r0sKQ+OVP4+IJyCqXu8wkLtPlG28zAoP+6WX9YWrG1DN3pLKbd27mAUgt0WK?= =?us-ascii?Q?yRRSHUcgESBxpTGDbYDHxImyEPvh/kXIRWESzSJ7h1OoGrrMGuj3cwhomy2q?= =?us-ascii?Q?WLONwf+PBqeHyFQ5zigzzJmWHXQeC700z3e1o+HYecsoBAeUFr1L?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 9c3d93ba-a5a9-4cf6-dbfe-08de56992f03 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:05.2470 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: bl6nq/1bH5BarsY6i2vXVGz4awMr+CGbbuyWW80Yw1pE807cyHSZweUlL25wFs1KOmkkaUAOI7axbaejF+41iA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" Historically both TX and RX have assumed the same per-QP MW slice (tx_max_entry =3D=3D remote rx_max_entry), while those are calculated separately in different places (pre and post the link-up negotiation point). This has been safe because nt->link_is_up is never set to true unless the pre-determined qp_count are the same among them, and qp_count is typically limited to nt->mw_count, which should be carefully configured by admin. However, setup_qp_mw can actually split mw and handle multi-qps in one MW properly, so qp_count needs not to be limited by nt->mw_count. Once we relax the limitation, pre-determined qp_count can differ among host side and endpoint, and link-up negotiation can easily fail. Move the TX MW configuration (per-QP offset and size) into ntb_transport_setup_qp_mw() so that both RX and TX layout decisions are centralized in a single helper. ntb_transport_init_queue() now deals only with per-QP software state, not with MW layout. This keeps the previous behavior, while preparing for relaxing the qp_count limitation and improving readability. No functional change is intended. Signed-off-by: Koichiro Den --- drivers/ntb/ntb_transport.c | 76 ++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 44 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index d5a544bf8fd6..57a21f2daac6 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -569,7 +569,10 @@ static int ntb_transport_setup_qp_mw(struct ntb_transp= ort_ctx *nt, struct ntb_transport_mw *mw; struct ntb_dev *ndev =3D nt->ndev; struct ntb_queue_entry *entry; - unsigned int rx_size, num_qps_mw; + phys_addr_t mw_base; + resource_size_t mw_size; + unsigned int rx_size, tx_size, num_qps_mw; + u64 qp_offset; unsigned int mw_num, mw_count, qp_count; unsigned int i; int node; @@ -588,13 +591,38 @@ static int ntb_transport_setup_qp_mw(struct ntb_trans= port_ctx *nt, else num_qps_mw =3D qp_count / mw_count; =20 - rx_size =3D (unsigned int)mw->xlat_size / num_qps_mw; - qp->rx_buff =3D mw->virt_addr + rx_size * (qp_num / mw_count); - rx_size -=3D sizeof(struct ntb_rx_info); + mw_base =3D nt->mw_vec[mw_num].phys_addr; + mw_size =3D nt->mw_vec[mw_num].phys_size; + + if (mw_size > mw->xlat_size) + mw_size =3D mw->xlat_size; + if (max_mw_size && mw_size > max_mw_size) + mw_size =3D max_mw_size; + + tx_size =3D (unsigned int)mw_size / num_qps_mw; + qp_offset =3D tx_size * (qp_num / mw_count); + + qp->rx_buff =3D mw->virt_addr + qp_offset; + + qp->tx_mw_size =3D tx_size; + qp->tx_mw =3D nt->mw_vec[mw_num].vbase + qp_offset; + if (!qp->tx_mw) + return -EINVAL; + + qp->tx_mw_phys =3D mw_base + qp_offset; + if (!qp->tx_mw_phys) + return -EINVAL; =20 + rx_size =3D tx_size; + rx_size -=3D sizeof(struct ntb_rx_info); qp->remote_rx_info =3D qp->rx_buff + rx_size; =20 + tx_size -=3D sizeof(struct ntb_rx_info); + qp->rx_info =3D qp->tx_mw + tx_size; + /* Due to housekeeping, there must be atleast 2 buffs */ + qp->tx_max_frame =3D min(transport_mtu, tx_size / 2); + qp->tx_max_entry =3D tx_size / qp->tx_max_frame; qp->rx_max_frame =3D min(transport_mtu, rx_size / 2); qp->rx_max_entry =3D rx_size / qp->rx_max_frame; qp->rx_index =3D 0; @@ -1132,16 +1160,6 @@ static int ntb_transport_init_queue(struct ntb_trans= port_ctx *nt, unsigned int qp_num) { struct ntb_transport_qp *qp; - phys_addr_t mw_base; - resource_size_t mw_size; - unsigned int num_qps_mw, tx_size; - unsigned int mw_num, mw_count, qp_count; - u64 qp_offset; - - mw_count =3D nt->mw_count; - qp_count =3D nt->qp_count; - - mw_num =3D QP_TO_MW(nt, qp_num); =20 qp =3D &nt->qp_vec[qp_num]; qp->qp_num =3D qp_num; @@ -1151,36 +1169,6 @@ static int ntb_transport_init_queue(struct ntb_trans= port_ctx *nt, qp->event_handler =3D NULL; ntb_qp_link_context_reset(qp); =20 - if (mw_num < qp_count % mw_count) - num_qps_mw =3D qp_count / mw_count + 1; - else - num_qps_mw =3D qp_count / mw_count; - - mw_base =3D nt->mw_vec[mw_num].phys_addr; - mw_size =3D nt->mw_vec[mw_num].phys_size; - - if (max_mw_size && mw_size > max_mw_size) - mw_size =3D max_mw_size; - - tx_size =3D (unsigned int)mw_size / num_qps_mw; - qp_offset =3D tx_size * (qp_num / mw_count); - - qp->tx_mw_size =3D tx_size; - qp->tx_mw =3D nt->mw_vec[mw_num].vbase + qp_offset; - if (!qp->tx_mw) - return -EINVAL; - - qp->tx_mw_phys =3D mw_base + qp_offset; - if (!qp->tx_mw_phys) - return -EINVAL; - - tx_size -=3D sizeof(struct ntb_rx_info); - qp->rx_info =3D qp->tx_mw + tx_size; - - /* Due to housekeeping, there must be atleast 2 buffs */ - qp->tx_max_frame =3D min(transport_mtu, tx_size / 2); - qp->tx_max_entry =3D tx_size / qp->tx_max_frame; - if (nt->debugfs_node_dir) { char debugfs_name[8]; =20 --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021073.outbound.protection.outlook.com [40.107.74.73]) (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 074B333B6FD; Sun, 18 Jan 2026 13:55:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.73 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744536; cv=fail; b=oiLiNhDrInPWpyWEPYOVXzUxazpJWBgIC19x3gICqU7W/158PaJ+jDiu3C53nLdFbQ3imPUN/ckp8raUmnQdc9AGvq7hVXXfpMYAZdR90HkY0SBVBwWaO43S3DqvGLBLaI0dyAOJyA57hg4oyTJOPDQMeannTho0VDU/c/pEuu4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744536; c=relaxed/simple; bh=kwTj+cC1ImylTysqkQBARjqHnqBFbS+W0TRtQJoBON8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=d8B6R/xVVTml+RD3RRJUQoILJq+RHKG8uEr2+FoxT8ULHh1J/9tp6VqtCWGjtBXf08vmQkmxZNt2WqHtteB6EKjKLnbr8k80vZvaT6u4xweUtNpeOsa8xrDFNScUDTruaxas6aViMwpuExzQL9WUqKjB0A3gAxAMDl3r3R/juYU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=MFvYz1Kr; arc=fail smtp.client-ip=40.107.74.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="MFvYz1Kr" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HR2UKhGPzC0gMB/JHNC6TKaGnNYjgRXn76/uGQAEKidzF7rOI4HsitsDOLaapVH4AtAy/U4AYvII+kMaULXpRjDUwfk0NjBjMpladbSaR8sKlaFMX7kJCfbfJ3WyIM/BuOv/cXMSfdXH8ZEgf0+3HzVuPmo7ohDWuoc5P6eZSpNPOpelA9GzeAEMgUkp4jREEkCjaJgKLUIaGRVzuGr0SwnappytSZ1MWd4GretxWKlG/TG87Zr5BJ4X4JcfEi/zFEeJVGWFONcHaL2WqPbwkB2Sd4wxiImlOJl4re8l/YjvwGf8VEm9E/XXKbfD4kedXHRQX36S1jSObNcFIxXAGA== 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=opAz+LXhmx1PYsHGKzojBw1JU4OeCZF78pzymrm8Q+w=; b=Ew6VjBTMXSavvyD5NAHmTiYZZUB+Zio/VqQJe/EB+1P9pOKo70AzLl6Kw6+CBdRe4ijIXbTXCFiL0z5mQan76z+sDOOH4cuG/NXvd9+91SGoGmWODkNc0i+zm1sZjfSZx+9TPBpAlqkFH5O0aG8ZrqaXmg3V2zuGGaCDRVOfFAcy9R28Zxjyfcg+UzIaf+CrPEVNgXzUjHN0n4Ee1IJK0wIDQLYBxXcy8CavbyqazsvprTPj91wsYUb27e7r0V40g4GZJDWP0VDQUj+eVpIT/pAx5RDJO092jCwV428gVN/NcDstz3aEu8ctBhMBA+4WIj4NwOJyo3ELc2w4nGRixw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=opAz+LXhmx1PYsHGKzojBw1JU4OeCZF78pzymrm8Q+w=; b=MFvYz1KrL3xT0yi/ysz7y3nrMbnzNNqdQJfy0cj9W5pEqLmiHAu2g8oyQXamTgof62JXhiIs9vSHb5bTuNxO8hnhcocZ568ycQvkP0SkbbVlZS4GkiYM3GSkikrTlXDb1LF5z7VmBmIbS96blfOHnVnq7oIIburyO+nqpppY4xo= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:55:06 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:06 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 17/38] NTB: ntb_transport: Dynamically determine qp count Date: Sun, 18 Jan 2026 22:54:19 +0900 Message-ID: <20260118135440.1958279-18-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYWP286CA0013.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:178::9) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 71651e2f-516c-4ada-d8c7-08de56992f89 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?9AcFuN2gCDMs6EcWCEtIkG9zXH/d4pexT5CzZ9KyUQ7Q/R4wigWzk8L7LpYv?= =?us-ascii?Q?Wdx0/LUgxAtwihzrTOAZQLz0E5/2IGekFhibE9T/64hzt9iPejvQ+IvVYhCJ?= =?us-ascii?Q?/XQOzCOHcQfbQRrsI5ICjItM8uxC6g25c+tSZxYeRReEG4eT6l8vGh1cZILB?= =?us-ascii?Q?iIaq0I78wldmEMsAdmaA8nJd5SrNYFFOyGfsUxLGa3/OuzY9vvzx1rIgF8IR?= =?us-ascii?Q?dR7V/5t1kdLehUsYcM1BZvQkX8BNIvH4oFghZCWwNUUSmWw4V1Zynpsh1bbx?= =?us-ascii?Q?imt8MxHg99b74cW+W5Zmr9SjbpO7JAzRXBSKhQAESnNcPyFTL/yDHcgJjrOs?= =?us-ascii?Q?DtSYZaWcnyL7kbOVH2iGEpxqH9szZfDe+RsYh5eIctdUAQe+OQfKbskZTmj9?= =?us-ascii?Q?MiHBr62+y3pw6eZrIqq87qUaVbC9bezlJYlZsxQ1a8SL1gMCSKEkIHLbm/ao?= =?us-ascii?Q?oHsDbyxf1s177V43jZUJFD8Qh6CdDj74TAch/z/OgE4/HQRCPeJZf8dsRgcF?= =?us-ascii?Q?v4sr+yaxQ4cKcsuUB8ZBZvomwzQZlJx3fojas/r3Suo9kSsmXJjWyqYTr7dL?= =?us-ascii?Q?I/gSpupGuGDQaNPfuVsUf0UAfL07TlwuiaLbK1NYIa0ZRLVSTwkeerFw9vIJ?= =?us-ascii?Q?vJD6jEaAp3uGQsYt2JlaR9wTm2zf6ym8MKKKwMVOs2QvXOiNc7U0xbOhC5Wi?= =?us-ascii?Q?JS/P+BIj72b0HYTBxfW8gq3WWqobAVUMPoRFDWeEAcUvVzXDL6A4m4pKsCYh?= =?us-ascii?Q?/8TOmrlYDBZ9TM5QEjSvAs123sd+SfwuhbAE8WKwSyEgm+gaky9JpszYZDLX?= =?us-ascii?Q?qGlvEuE+diV09oaB4qKB6a52PIcrWbObiM9mgZk0Rivf2ekgllA/4na4WuSK?= =?us-ascii?Q?WhtBWXt0OApCX5CnapN534MwdZLXRnmZo96WgdaQHkS9Vlr9c0ncGkqkNO1s?= =?us-ascii?Q?3KJuDYKk2jeXIjCpUODOvso8OlJWVAGZbvxlZtUhzDyfZ42hgbgzGqimcn1y?= =?us-ascii?Q?+lfG56IeLrqu6BNZMx+8/BNlBpOYPFJETyNOEb6BcA11sw3qsRveeDPcTQ/7?= =?us-ascii?Q?XoBEVozBwKNQuncbfH1c3D8hgL+4TK2awwHT6zzPu7WqK/dixdr7ijilwae3?= =?us-ascii?Q?x0JzixHOcnGX0NUhMQXZh7t3Cf8cCuO2icDMQ2AjOL5RqoU0iAoE3geu5cWA?= =?us-ascii?Q?Nbrx11phMOhbVV0huxCvmW2NYsZkbcnIaRBobzdhAzkvqgXZ+nSHRtNy5umq?= =?us-ascii?Q?L2PHAHftpRXyR+riaFth+utRIWGSBAvyTYTLr7VuFP4+JxtZcibOO3qYEb6v?= =?us-ascii?Q?XlPI+/nJ8ptCeUEk6wuyAYzBlvTCn1gdj1hfwmRgoGO1kpTAftLySbEDcH4Y?= =?us-ascii?Q?0pwzvEr0SzIPohj9v1lbNv2eARkfsi5DKb47UoX01IpuB2zPmlkY7gAIDpLE?= =?us-ascii?Q?PUurN7K9y7wnkjXIlyI+161Fuo3++NVkH7Ns07PNBikxVh9WEFjD1G8Ownzb?= =?us-ascii?Q?T4NHLRunjvr3CWsHwJSLxiL4JTC4fUsSvoiwlH6pyfS2q1uaNsANJowCHJ6C?= =?us-ascii?Q?tJmRPS7yO7pZSA8+hVggiguqodnzgFHTw9vkIXm79/evvvmzod0eMp3Zdq1P?= =?us-ascii?Q?oQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vTdvvSBN3GjkY5ub4S/hd0HVerrzWoSI38adzTmMcwoXBm/JtsoKHMY03K1v?= =?us-ascii?Q?+4bZopFUzwtVMbiN0p1uqcUe1XYWIfmrmT//B1YzlGCFdo2mTAWkeZgkT4ex?= =?us-ascii?Q?1koGZy1GKP/yNfzFe4y6pnucE64XankT6u7e0ngoS2pUDaLGwf2/MClyTsEE?= =?us-ascii?Q?xmXVMMKfusZvYsPB3JJ/M3q/4TNO7fvyIy9QoXgi4Sni/eTGp1PY5U+ic8QL?= =?us-ascii?Q?Ve10jN1Egh8+z9K2Rd2nVXgugyhAWcfRsP1VUQckmaEznXkIy75hcQN0OZna?= =?us-ascii?Q?48QPzM4Rtal04QgNJVUeHnFabz+k+z8JiYwMSrxevkAnEgcWfLnAAyqk7ayZ?= =?us-ascii?Q?iVj60jrHBuSMeQA4yG6AsSJlm8bOFMW0M905yobAfTojblnSzfHAftz85sox?= =?us-ascii?Q?uY/AXaRtEaigGfwXriv6MFeUzV8m8rFiXbNroL1S9du4x4EEzpdchfW00WQi?= =?us-ascii?Q?5M87Pap6IJ53xrFcVcRqDgMcjWbRQyGAiQ9jvNiD3fjx7HX0ghZX2fCoq0lI?= =?us-ascii?Q?CbAsnzSlTwgUmJB6TvSDKhNBj3juvaBlzj2mFSS195NbInlMAJzA950Kd+Fd?= =?us-ascii?Q?fH+aPFYqXfloKsful6ySUJwE0cO7+EdNbdTAQK8S1TZdiRe7nsn2qN9rIdhV?= =?us-ascii?Q?N2m2mvU3Ell/hnq4o5i95kxq/QL1QGweJAjO7BSB7KfXXtTX74XfaqZaLd1e?= =?us-ascii?Q?uxAK+hrcFkadoPzCsaWl5TXsEJCXxtsGXH+++vcUiQWgGCLOV7TS7RS9rIbT?= =?us-ascii?Q?FIIAFfx5Chl4gykDaI7bsi8SqkMotBS/rVlTAnW/4X25fw1y3gk/j+VOj8Em?= =?us-ascii?Q?x2FCfTP1Tg3vjj1msC8RMwy+QB5yodJqMggGZ1o5cgZEI/qNYND+l8tMlWW3?= =?us-ascii?Q?STMEmzatgIsNntMDPtU7XeoCiizE/nhI3bdxmUP8i147NLfyu9BUGnmIpo48?= =?us-ascii?Q?+bTuW7jilYVJ3jI4caNBp3CY5E665QOrb5RD5NT/QP6z7BSiYV5gBmD/Zj+r?= =?us-ascii?Q?LX5kGzKuE8IykZoYm3GEWkbSErOl2+zSeNYz2w6r0cdNSk8HbzQSRgH1AB1O?= =?us-ascii?Q?mU9CCsxcZ1BLBLWjUGcwUIF0A0ljehDMJjLfr+LVJUmRl6wPwyZ8PcTngb92?= =?us-ascii?Q?yTFMzRO3YZnH3Um9u98TGsXPoC+fjlPyaREu2acK+k9qL+oC1fxMN3LIaDQO?= =?us-ascii?Q?kt9TRlX3a6xzabVakvTTKUaxul8cE0drG4wBaoM/6NoOIwgGRA/v3otqSBXF?= =?us-ascii?Q?WjONlgG+KL+mST40ZAmKmp6LHwTbVuISvK1obz/oZK3TAX/5V/Y19EAmv50E?= =?us-ascii?Q?uH5jJ/hf6/Ro0wvJSrcfjbqn5bvdOEnZe8kAaRJLjrWLiluNbiFLFyazSaZW?= =?us-ascii?Q?kt9bImb/YocKRSSwIeSVylCJgHsHtFmIY2v5nF4pSOrrNpUeX6CSf5IXAD+O?= =?us-ascii?Q?qpA5e5vdUADxRxMxLf9Y5Yo0MopltIzOs60jKGRuY5SwCKK5kQAyxMlaH2Oh?= =?us-ascii?Q?bGiTKWhx1HVsP+HhxuPyrbFB7gvyzBpI+r2hnhLcR0RSQb2okKnN2Yq0VL/N?= =?us-ascii?Q?aXIPNj95sjNPvzn9RdL3FZUqbrp/UYhX0icWKuQZmrAIHeIFGirg6YFNcVyr?= =?us-ascii?Q?ZEqYtKmco8QBYUqXy7mqktwEoVUPpeVTLsDWYAPL0N4RKi4j7647BPKpZ7a6?= =?us-ascii?Q?ET1E8q5YGC8+z4cLzaZLWl+nhHvxb1lCDFzWMPu9PQvUfglno8Fnr/kh+BZP?= =?us-ascii?Q?QWIPxHc2B32ACC1KhfYE6FLwfpmYoi6Z/OcMywH3dhmy8Qnsj06b?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 71651e2f-516c-4ada-d8c7-08de56992f89 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:06.1134 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: hxnWWCPxuOwOtzqdh3CaedBqKHPyB80gswPr9qPhP0UFM6wmHdrA2BtfUDMKVcgYnogkv6gh9yPGCx9MWqzN0w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" One MW can host multiple queue pairs, so stop limiting qp_count to the number of MWs. Now that both TX and RX MW sizing are done in the same place, the MW layout is derived from a single code path on both host and endpoint, so the layout cannot diverge between the two sides. Signed-off-by: Koichiro Den --- drivers/ntb/ntb_transport.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 57a21f2daac6..6ed680d0470f 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -1022,7 +1022,9 @@ static void ntb_transport_link_work(struct work_struc= t *work) container_of(work, struct ntb_transport_ctx, link_work.work); struct ntb_dev *ndev =3D nt->ndev; struct pci_dev *pdev =3D ndev->pdev; + struct ntb_transport_qp *qp; resource_size_t size; + u64 qp_bitmap_free; u32 val; int rc =3D 0, i, spad; =20 @@ -1070,8 +1072,28 @@ static void ntb_transport_link_work(struct work_stru= ct *work) =20 val =3D ntb_spad_read(ndev, NUM_QPS); dev_dbg(&pdev->dev, "Remote max number of qps =3D %d\n", val); - if (val !=3D nt->qp_count) + if (val =3D=3D 0) { goto out; + } else if (val < nt->qp_count) { + /* + * Clamp local qp_count to peer-advertised NUM_QPS to avoid + * mismatched queues. + */ + qp_bitmap_free =3D nt->qp_bitmap_free; + for (i =3D val; i < nt->qp_count; i++) { + qp =3D &nt->qp_vec[i]; + ntb_transport_free_queue(qp); + debugfs_remove_recursive(qp->debugfs_dir); + + /* Do not expose the queue any longer */ + nt->qp_bitmap &=3D ~BIT_ULL(i); + nt->qp_bitmap_free &=3D ~BIT_ULL(i); + } + dev_warn(&pdev->dev, + "Local number of qps is reduced: %d->%d (%#llx->%#llx)\n", + nt->qp_count, val, qp_bitmap_free, nt->qp_bitmap_free); + nt->qp_count =3D val; + } =20 val =3D ntb_spad_read(ndev, NUM_MWS); dev_dbg(&pdev->dev, "Remote number of mws =3D %d\n", val); @@ -1300,8 +1322,6 @@ static int ntb_transport_probe(struct ntb_client *sel= f, struct ntb_dev *ndev) =20 if (max_num_clients && max_num_clients < qp_count) qp_count =3D max_num_clients; - else if (nt->mw_count < qp_count) - qp_count =3D nt->mw_count; =20 qp_bitmap &=3D BIT_ULL(qp_count) - 1; =20 --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021125.outbound.protection.outlook.com [52.101.125.125]) (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 9E9C233B6D4; Sun, 18 Jan 2026 13:55:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.125 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744533; cv=fail; b=OMqgHqx/v40oiXlt9JaEnonkRj+pp3rdulW1IVvbXYYf2vKzQ+LwLlF6D0ojipCCLfbdI/WM/YtHCQsRrCicAG8akZSR5CCfgKkhF3p0xH/lM0sn+8cHfJvU60C/tUGOxyJfuslmM+sNvqTOLyftEHBkTsV9LqZZROKgpPuSL6w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744533; c=relaxed/simple; bh=gzgZedCB/qwlaSF3AEDEJihH2/K/+5aMsbA+b3VvbBU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=nplKNDufbWOe9cDXSXEcjeYg4isPpmrhR8FDmv4RUTYEqyY/ft9tYMjfpctXPAWWv/2pgsRfDARt7Fz9UuIhAjij8MifmC0xL6ogHqToS8iWep83P2ZiW3MUusanBDdvsd8vYIVukBbbAsQb+iECplZjS7pSjX05dG4Lf9+v5k0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=r03xJ0nt; arc=fail smtp.client-ip=52.101.125.125 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="r03xJ0nt" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=n1sjbzgQcN34PRtXpKXBdAwv6XkymgEQUk5//DG/JlL/1UPMJ28d0p9QWAhVkiPFvBBVkXj4RX1O1wg9vkGtnJ9d5lvg4dVWciKZn4qg7XgAtXFm4e7hNiLUCNcLxK5rbEpthVSHGkl6LCfmyBzY4T9EJDvZg7MzmRrpW4PhbYVlHGJ9QBgqgS3kGjXmhfjMj+zdfGOT57Q9u/xYL7irwUmfwnI7Wb63tpQNszvltahqYL7mV3+NLBnluhN6RRtI/pl1kty7dJs6YL5wBvTe3LjEkZo4VqMvrHm8jMaDtr5AB/rtmW0jFiBX5WQdtqz5/NFk4sEVF+HMsr5mSgJK3g== 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=nqVYjK3c66uhhQ5bU6dhh9UpoNamVRONI0t7AFi6xIU=; b=dUFwlz6qD4K6GeDNqV5c22dS28CzfH10aBpYV+1hEIi+GP0tlx5xf39ehZQggSMmSfKlSbgQLSHKDagPuZqJhDp5VtMGrlFn1+xlaWrL1/Y46XIW/KikPG1GPs5g8uodqqWyFDC6f6E0o/z1zUqv43nV/aXRbm8PK3NF85WrGV99rNRnSetksnC6isTtLv+TGY3Ww6debHW38IH3050CdD4CN5VbJMmh3/t75gjIQS1Oq+6IaJo2FVMdCT4HTwuIdiVLs2Nt+mHUzVc1XQVeNHznCzO61UD8aVk90QULKvz+XV8Dya/L7Ia4J+gTolc1giqubuuiZG8hxqeuoxbfYQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nqVYjK3c66uhhQ5bU6dhh9UpoNamVRONI0t7AFi6xIU=; b=r03xJ0nttW/hidNdQE7jP4DlFXMz3uBCkcvlmUYB9LAgYBlcnI7pCLQKvpI1ozRPAKsMZ1U49ILmvAKL/Xmus8tFaaOYlRe/ZvVNiRkdreZXxuDDMxQKUY6rwJihLpiBUOMSRv4tNIAO7Pvp2JF98C3Ezyx63BFUAWaqfQTcrGM= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OS7P286MB7353.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:440::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.11; Sun, 18 Jan 2026 13:55:06 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:06 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 18/38] NTB: ntb_transport: Use ntb_get_dma_dev() Date: Sun, 18 Jan 2026 22:54:20 +0900 Message-ID: <20260118135440.1958279-19-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP301CA0080.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:7b::9) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OS7P286MB7353:EE_ X-MS-Office365-Filtering-Correlation-Id: 8fd928bf-7815-403f-c8c2-08de56992ff6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?EGEaASkco/ECVHIPI6saI/MGf8mviMi6ExAJhh1boQvpD66XLrhjERNZ65NH?= =?us-ascii?Q?Ss5ArcIhRDSV2f2u7JSE+xsl7BnIdYE6F/FUHxkRWceI5yvvbA+8VYBZSdq2?= =?us-ascii?Q?ftWTcp+M7HnJ4APTEckzClxQPL6uPFezexh521WDHjPOYlzZopJJspsrGOwS?= =?us-ascii?Q?sBkXN6FITYA3TGygW9BXp130nocLoUToClCZq78yQu6QRV/tGRak1SgBcFMo?= =?us-ascii?Q?CoaKz+3TxJH+wqndf6o0fh7dnoJRhdX6wNdlhp1WX3ArxHw1hisBHW1y3jId?= =?us-ascii?Q?Vq75ATtROWemkgJmmoj32ovNAjrd38tkU3S+occ5J0XGtW3VldpnlDUEPwnl?= =?us-ascii?Q?k0Q3ickpbMW2YtvozEBTrKzmW8rzN6KDBPFGfl5OnIL+uW+SJRvuA+1Z9Sut?= =?us-ascii?Q?PL5ltFZxMLygFkrDkgzRrNbVQAKS8CDIWpJlNooNpvKYeTvxHK0GkYtPNWg+?= =?us-ascii?Q?U4/zbEStF/r4+mBYGA6Uxkohd/VC/uOat/79K2LEyik3N/nHeSYFPDNCBfty?= =?us-ascii?Q?xcvYm08qX4kCSokAI7bIWEkwfQRO++bOPNoCyu0zOLaYlNlkJH2C57zRBVeX?= =?us-ascii?Q?UPp//DSIQGV3C1bLfTllXTss8HPCVS70ANclpfxKABjeJmlkdDE/2LykmPEL?= =?us-ascii?Q?ANHzjMUt/7QFokRfRaZNQ761FfZbHaG6PriApaq3GivSLvOB3lx0OAw13gkY?= =?us-ascii?Q?hzB6wlHoempmfMxUqf6drdb2aunwWAjXjOvHA4ilpnVLRXMvHRaqlOXep3H5?= =?us-ascii?Q?TWZGIGEhLgHXD4qftepXwLjFIsmoVZY+aUUE6wO6NuAtOceBX6XyBVrwj8IM?= =?us-ascii?Q?fQg+meajKqpmPjC0tUssxlm0CgAY58BYNh+dr6ac6SlIklqpD+Na0A+JlRDk?= =?us-ascii?Q?kxYY1r/8+46cUeYHamnxb7zxnTBUB2arV55nVYNiYmQAzoiJl7XzzI0Wmrhd?= =?us-ascii?Q?alV7tJCCBezFjb4gA+fZP6lTmpys0UPF2nrJDlEK1J7xTjMr6M9J7yQxy1HX?= =?us-ascii?Q?ej+02TxlnjxWflMWAqOmpKhaVVWD775D9dYd9qQknICh2UfMebuR0uCuRob9?= =?us-ascii?Q?bcSHKZH/QvWBFnVfCMwFh6ycggLr1ifk856py9Vp73h+9gQrZocS/Mm0fQbq?= =?us-ascii?Q?tlB3UBER+wZIe15JR8KH57fc5iqExiRPINIMJtgud4VfNcoXXdkNkNy16tuO?= =?us-ascii?Q?vno3p7s8vy48QHDn3iPnQopdrncgKHDKv/n7Yk59W/tG7+yTmFj3zssmNgRt?= =?us-ascii?Q?Fh5EHuMaaNrP2sI+mgQAeLIswq+l/0nOR9aDx/8bb4+ybXAtED6whDHO3U0g?= =?us-ascii?Q?CUoTR5OGVSi7fuKUHVZjEfYPkdYbNHfhAuaHmq0mh44cKCAd1+1NLXKjFCpV?= =?us-ascii?Q?b6crQDIaelfFLcmdJiSn5MTeIB86ro50+PFDlvHg1hiTit/6oVyb6abHAuWs?= =?us-ascii?Q?ki9Yr0xb/LExl/zz6xG0f6cvnPN8Cf9SvB7aMuFB22dpMAKLmYL/SpRzYgsq?= =?us-ascii?Q?DrSO94oFUNVeVdyiCoc6x53m6EFrDZG0A/Rq+UZd2XcNwYBDq9ZXFSb9JO6x?= =?us-ascii?Q?a+bnGfFl/qT7eJmzCtGOnO9eaqX+xGLM8S1jvVf73JWJU0UjOfCPzlpaFG8W?= =?us-ascii?Q?uw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(10070799003)(366016)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?b6VYvHpQTTKdzuMyLBgU23TrUyGOwsO/vi/XIro2W9CwQ/fRXyN0txiyBDaM?= =?us-ascii?Q?iMpnpRevU2viKAnRM7In9G7bttLuaWNeCMFWkUyGCCWn8NNA3Hkz9bD2reZu?= =?us-ascii?Q?1N7lKIEtNoOyVQjq8neoP5S9UBqGBVYeWIXUAV7ccjtB2647NyruCHX/G56U?= =?us-ascii?Q?SVCDISHGBcC2JFXCrzPeeISYctHERP52UpdUdqTtnuGz1EdR8bxWIf4n+9Yz?= =?us-ascii?Q?yGj5w6KLqVSl1PPQiNhtSy9oCfeezF/brvphrR4JdJlRUVH+aAOBBldy5w5v?= =?us-ascii?Q?zQEsKX2E8fGwlSLLYmFoTXQFFVZNMXoxVHc8Qt98OnDYwshtIJ/zBw/97FWK?= =?us-ascii?Q?9WGpuD98Q8rNz9ShjYT6ci01c4U9JmVh8X+hGAh6QXwkAMyXD4q1cWmsW8VF?= =?us-ascii?Q?BhdckU2m8HaNZUhfIErJXxAw4DG/r9g2Dd1q0ovHNPymyEp0O99+z0E3MG+c?= =?us-ascii?Q?RE//Uww3Beh4YXI4Jv9lOpUF7ioJRMX6quilzVhFPJOMI6+EQMhijdkDy4+U?= =?us-ascii?Q?vumCfiIX91MBIgJHVy/04D7S7EmrC5ue69dFZoGcqHg9wbGnLXCnnGWGuxHD?= =?us-ascii?Q?a616Rr2GXwUUaaJ9dYj5vmIrtr7P+Y4Fu4YCHGz6iUTgfqWAoaKlq19VHTSn?= =?us-ascii?Q?pXhNWsaL/gGLoABoEbmc1YoU7gx+HiFFLM5getGbGE0//42Uhll1KCZFETvp?= =?us-ascii?Q?MJ8vfpZ5N3DZtksn2MCI55QCLzTt11FxREG43YgpNjOk1lU1Qh1wGTPDx5x9?= =?us-ascii?Q?NnwmQHcxadi9xHV5cEHM2duHdn0EmRYKRxd7RmCaRvm+CifkHGqyNw6O+FUR?= =?us-ascii?Q?wb3WChqXmYn/rjWl+guokNsFFV7QWuSBK66dKSKIakOZleZS2IeKCDH8thIL?= =?us-ascii?Q?UPHJGPpi+b4TSfBJG53DRALtBQyReB2yO/h3s2892EVUgL/if7B0jE7caRFd?= =?us-ascii?Q?+Zxn5xS6pbR5ZXAP9YHZ70DPsV8HRyx+/4d9AMCflwWgrY9owAF3jl08/9ah?= =?us-ascii?Q?766HeyZEc4mtoMp4OSgB2EDmkUAofdmrHXDrFP7MSzrlln79YhrgruRTrjXP?= =?us-ascii?Q?nd1NXwPlW4Of9sDeQElNOKwqdGwWoUQgJ2lDY/XaFMpHAte97/ddWv7lokq0?= =?us-ascii?Q?rqwvLzBzCD6q8qg1YJ7RduAbi3AK5c28uCUt7bWTW2NdAcE9M0KebCd2h7hA?= =?us-ascii?Q?moPzLF8uWP4WxmdvDzYVAp1mV3HIKe3kEkBevWlunWnijood6AGR+nHzXRf5?= =?us-ascii?Q?7ok1sU67n1+nKUAhQJSgEv+nk/tOvrrFUXqb97nUNNnT27ETHUZi7KBtednU?= =?us-ascii?Q?g2m5FrANr31U9em7szWonHj071NQc70BHcN+bNi70Q15tSejGxPkzmVj/q8l?= =?us-ascii?Q?eOUFIR7twRdBthbfcamt94Iu6/2OGutFN3JFSxSMLBaFxq6XAMru6xUvC5s3?= =?us-ascii?Q?bwpTr5wAtDPq+z3TlhNwMQ3i3l1DwSSg+N93eFFKgPvET9Jr2Bw+KkOE/fgB?= =?us-ascii?Q?Cr97TT31Rhu9PEpBr4nUvf8MR3L4jlM4c7GtZ67eKGfMS7uUv/2Zf2So7Yq+?= =?us-ascii?Q?rDAIt9BttZANmlSlS5T3CX5cy+hRcRFL42a1i36abU7lEhpapeXtDu//dVjm?= =?us-ascii?Q?jTwTDXQ9vRHp6suxwT+6NWWGvQ7fAg/s7ot408VIJnHqthO1LlBfT7ENE1OR?= =?us-ascii?Q?xLDgTVTfoygvXJN/QuYo7FP2dBiJ9jKTdSkw6g7KYDEMQ+9/miZTPdE44/Th?= =?us-ascii?Q?WJIIzsnkl0aiLyHAksQOedGJ4tg4Ues2mDt5giX7+2qdOfaqMaRA?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 8fd928bf-7815-403f-c8c2-08de56992ff6 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:06.8279 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: LMoCg7nZ9objVO1iSapuRNZYk6XDYfLzYa4H4qmwUA1ZPqfgm9ZuxWgs0LHHQ7e1B9WCgVrD2fSpsxpYb2muSg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OS7P286MB7353 Content-Type: text/plain; charset="utf-8" Replace direct use of ntb->pdev with ntb_get_dma_dev() for DMA-safe allocations and frees. This allows ntb_transport to operate on NTB implementations that are not backed by a PCI device from IOMMU perspective. Signed-off-by: Koichiro Den Reviewed-by: Frank Li --- drivers/ntb/ntb_transport.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c index 6ed680d0470f..7b320249629c 100644 --- a/drivers/ntb/ntb_transport.c +++ b/drivers/ntb/ntb_transport.c @@ -771,13 +771,13 @@ static void ntb_transport_msi_desc_changed(void *data) static void ntb_free_mw(struct ntb_transport_ctx *nt, int num_mw) { struct ntb_transport_mw *mw =3D &nt->mw_vec[num_mw]; - struct pci_dev *pdev =3D nt->ndev->pdev; + struct device *dev =3D ntb_get_dma_dev(nt->ndev); =20 - if (!mw->virt_addr) + if (!dev || !mw->virt_addr) return; =20 ntb_mw_clear_trans(nt->ndev, PIDX, num_mw); - dma_free_coherent(&pdev->dev, mw->alloc_size, + dma_free_coherent(dev, mw->alloc_size, mw->alloc_addr, mw->dma_addr); mw->xlat_size =3D 0; mw->buff_size =3D 0; @@ -847,13 +847,13 @@ static int ntb_set_mw(struct ntb_transport_ctx *nt, i= nt num_mw, resource_size_t size) { struct ntb_transport_mw *mw =3D &nt->mw_vec[num_mw]; - struct pci_dev *pdev =3D nt->ndev->pdev; + struct device *dev =3D ntb_get_dma_dev(nt->ndev); size_t xlat_size, buff_size; resource_size_t xlat_align; resource_size_t xlat_align_size; int rc; =20 - if (!size) + if (!dev || !size) return -EINVAL; =20 rc =3D ntb_mw_get_align(nt->ndev, PIDX, num_mw, &xlat_align, @@ -876,12 +876,12 @@ static int ntb_set_mw(struct ntb_transport_ctx *nt, i= nt num_mw, mw->buff_size =3D buff_size; mw->alloc_size =3D buff_size; =20 - rc =3D ntb_alloc_mw_buffer(mw, &pdev->dev, xlat_align); + rc =3D ntb_alloc_mw_buffer(mw, dev, xlat_align); if (rc) { mw->alloc_size *=3D 2; - rc =3D ntb_alloc_mw_buffer(mw, &pdev->dev, xlat_align); + rc =3D ntb_alloc_mw_buffer(mw, dev, xlat_align); if (rc) { - dev_err(&pdev->dev, + dev_err(dev, "Unable to alloc aligned MW buff\n"); mw->xlat_size =3D 0; mw->buff_size =3D 0; @@ -894,7 +894,7 @@ static int ntb_set_mw(struct ntb_transport_ctx *nt, int= num_mw, rc =3D ntb_mw_set_trans(nt->ndev, PIDX, num_mw, mw->dma_addr, mw->xlat_size); if (rc) { - dev_err(&pdev->dev, "Unable to set mw%d translation", num_mw); + dev_err(dev, "Unable to set mw%d translation", num_mw); ntb_free_mw(nt, num_mw); return -EIO; } --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020105.outbound.protection.outlook.com [52.101.229.105]) (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 CDBE833893A; Sun, 18 Jan 2026 13:55:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744529; cv=fail; b=hR0DmZLoJ7ItC7Cg3I0MTNBOffv7xDDGcr9ositPBT3Vox9yqLBbraeGNctZqidEB4pl9M/XFNZKdKF3LgF5ndCWE8MTj3LNZhO2fXnR5L1km4/QUNacRUTTvm02FQGdXsd5YAvNsLXLUtBziQgCzLOpnyvMORuDZUA+FoKBnmo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744529; c=relaxed/simple; bh=hZnvUiXPFpoURWd11hhYfbpdhpBdjpCw6fZ9szrG8vE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=YRSTIP3OSth3Edvaq59djF0op93K/D0JYMTxwsr2Af9aBKDBlkHKCVkgwo+QYMuT1rwf+mKJ3sVOgPv2rGdXbrv6wPymCTU66EdExI7ifH6cbwGyh1+yB4GGVOVtXGGF4F2q/pfwjbFZLbKG1ItFpnKCd9q2N/zbas8NjWMIhUs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=rbiW8xZc; arc=fail smtp.client-ip=52.101.229.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="rbiW8xZc" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WWsYW3pVBXZkW4KPusK3nDAjMEG6Y7v4ypXEMbAZtyqosIu3aIoQSY7smqKaQh0K8mWGh8wh1k6MZmFE5ey6WBcooaxkvwuJSIqxNxxCTdsxGGR7CsiaHakQCEbPVmb4TD3OyUEqv7rGGrR5FVKSK8DhuHr395grxwT9qR1kWc+J6dq00Zp06+InlbqNp/gYsOFAW4JcAMxrwbxMudahrTsC9D3jFJ04xw28UCOSVFqnkLAqT873yllFNTXAkiuOutWqE7YkjLX43Fs/TGcCO09BQ/Lc4IWkHPWHYsrVE5JIChmjpz0SXLCtWRtPFFZTVXiLFoxvzD3Vf4byhnizSg== 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=NCX2KUhrJp+BtZj3mlbTsAqjCXlkuwb3D0WhfoJgnEo=; b=by9mRXRrDLT4mxTvYxRCSJIZi6TG0UdIvslY2I+R55A8r4KFZ03XX1SX41OupXa5LRHb1e3IQ7o7K5NKjVmW17NSaqtXkdvkCqofRJpMI41Zjli6KiBkQhIWAyW8tsYTIJcKxKU/YLKkQMWe+wIem6mO49lTm3arBsE7vPuV2XFKAERg5s70beP0/RgueXHbGwIpOqj2BBqdZmuHCexj9MggWoMmQ8bR2TcQhVcCm6KrlGfqPEEngtqwT1ZaiRDNTloc4AygpKixK7XfeVzGK2htXo3jCUB0DSsYKt4Herc/J2/AXhk7pvn5cXpRKsAXmI53ihKwLhZYhJkz5ACrhQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=NCX2KUhrJp+BtZj3mlbTsAqjCXlkuwb3D0WhfoJgnEo=; b=rbiW8xZcW+TPryiXXQH+D3zeRNnxUwNJF12lpmq/uEmUor0BsPEwQSK86byp1VaBm4TiGKho+ghvv6PVdpKC7NhXhqCg5xrjtdh2oxVUkhDhbOvs0FfwLJ5MMymv/GXaVxCAou2bUrvtvNLvO9CEuvicX4pJjMZKuAZUx3SJhhk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:07 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:07 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 19/38] NTB: ntb_transport: Rename ntb_transport.c to ntb_transport_core.c Date: Sun, 18 Jan 2026 22:54:21 +0900 Message-ID: <20260118135440.1958279-20-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0099.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2b4::17) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 3ed25f7c-2061-4a56-537a-08de5699306c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?188G+fTbX40aGr6B6vr84S6a4/2XuJ/cwWgunElI9WuzmzcNGvCec+v3PQV1?= =?us-ascii?Q?kGmjGJelxiewuuFyjfKghe7+LXW/nXr25YeZr11aQnq9JtDPlCHFSUk5ezHo?= =?us-ascii?Q?ZYzcbzyzVCrV6+C1n8QveU0oBSFt3s7zpdcoa7nk/Bppa2r+hbA1+4ic13qK?= =?us-ascii?Q?/QkmjrysvFCSKK4G8EjNC4z3gG1oOtJ1JJyQSL+xY/r5YQyC8jcvpjdEbtEb?= =?us-ascii?Q?ICx7Z9SBh6qZHc0xPO3Op4vP8bXcJbiTeYZCaaHdCb5SIyoWdzCNp4fg+K0M?= =?us-ascii?Q?qWDFdCmgj1KbEgBIzkbtturRwBJEN/uUGmusetT6ZPbhT6lmvI6nP0pWw8zF?= =?us-ascii?Q?Owput37td8RewBNkOfJQZyNJWIwvCJ6j9GsbRIiLQas5TzGZW0OXCniDkFHr?= =?us-ascii?Q?w4rPfWidW9/GKwYnRgweY+Q6PxcH2Vr0Ahl4AMmNga3Wqn8iuBo6GeljJXSw?= =?us-ascii?Q?gg19DY0vKKA9qHbm9AUPCuOhNaEe9R7eO55OXdxEcul9s1Jyef6XAOfyJJAq?= =?us-ascii?Q?+w7Jl96zo6w4+BW21wyC/Xj+mEDnDn7/wGGS1C/aZU71ryDdX3N59HGPK7+z?= =?us-ascii?Q?XZfbu5n72+FCww33N7G9EOu94hNWcAv0yqPGxsCiGz5IJle4spxq9+QJhQA6?= =?us-ascii?Q?A5BUsQ7FkLGBa/N9tKTHzt0QMXN58uOPzoan2ex9WNp9jj8loLj2r96wudTO?= =?us-ascii?Q?delzCpD3B6ln4bMeC3IwOm2COiQ1SpLku0y006iD/5gNfDEO5hfqNEik+nez?= =?us-ascii?Q?NCwmPQPYKlPhClSwogVSVu8896ndkGc5dzJvnR+/QZEAAs4CzJxeUxqE6jhT?= =?us-ascii?Q?KHX181kc6/dbhsQKqTLocAJeMbfq7mbb2YEk8pB7kQUwWvJxPJoH8q7j7Kng?= =?us-ascii?Q?rBx5p/oAnzG0ekfYa4fTmQSMwE14Sj/saBGh8cINgyIJv6Nuq4XQkCsu0p6L?= =?us-ascii?Q?m9IrJ+VDyj9/8b/TZY2UmiAf7U6Y/T8JToqDDBjWuOFEhUEig0yAfFdx8scv?= =?us-ascii?Q?9339rrS6G5EIevzAbL7C6WLWNym03whKg0zsoHd27flbadF9u0BKe3BJNGR9?= =?us-ascii?Q?9jFmXzr4BgNY6Qmez2L+OBoQNLq/N+CB9ok/ocMltcASJTAI1T2zs4Gci5IS?= =?us-ascii?Q?kbj12VfUT4Qsi34CHq75jvur+9u8+hQgxHE5p/87dXyF44iPg1XM6CiRDthq?= =?us-ascii?Q?3HR6P1WMCwUnw0PxAjGeiZXlxzgld7WCs+oBSULur+yiiogviw2wwEW1PNlk?= =?us-ascii?Q?hz2Pcr7Cy7Mz9aZHtAblClvIK+X2C+8oiNJD1G4iWafmr5F8A7t297Inn8F2?= =?us-ascii?Q?KjWCUsovosUI69rumx5UVtw8K9neBowBmSqKKTJpfE8JjTiHrJjjPErCZSlY?= =?us-ascii?Q?zi6z33Cl67AdU2YU4NapRiZYZ8xu2gdr6qHlnotRSetKs6+LkCObOOwF6Oj+?= =?us-ascii?Q?D/Uj1eff7e+An9Rs+0UteeIIdz52E2e3hXPOjLY9abCHe7K6KMjn7/wEqtvb?= =?us-ascii?Q?SX0/wALSvTZH9WEyMXht51sf02oqAZznV/uBXItgXu1vs3EtpLthvgidegiz?= =?us-ascii?Q?7ObFM/GantohRuSsMKHE1Dm+2AKUFzktxfQNoboygCzV1rD0VPLXwuff4RYv?= =?us-ascii?Q?gA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?7bL6JYQXpTlW0tKqsxiNXtRLHCuOceHoUrrTlKMqGujusCbR3z3CgbSdfwLQ?= =?us-ascii?Q?T2+2lxGqjqiB5XC4XNLdzm9PZTbr7sX17sTXpAa0bqVxUtxZeuJz8CYu3zeP?= =?us-ascii?Q?7pBECj++lgdp3hKpH0NnhnmARTiT3CSJ2g8OCQlnuYTfHqLfw9ZURHGb0yG6?= =?us-ascii?Q?/fmhZ9np/8x+HOy7zdXc87gAfLdSczWE2FB0xjq0GZwuVuFJawONGTkhGR94?= =?us-ascii?Q?wsUralM3qav2tAzsdUfCnimvXu+0EBvH745laE95/p4quFyR43ebexy9MwyI?= =?us-ascii?Q?RT0hBSghbKAs2Irp/5btrmWpU5jjJGHVOFWB/5WwALw5K/+WiPdN/crWlcJv?= =?us-ascii?Q?KFPA2oEastICemhP1IghZbcweNGj9EVqyzdEd/Nf5d2vCvompfY33vOZ2i6Q?= =?us-ascii?Q?pYgK34nLJSfyob+I2I5Uh/R4XK+0a84W04eb84a18iBgLDJfwfvR4xGRYM95?= =?us-ascii?Q?uUbnOcehQ3RlKI/KYVnMltIUBeYPGXlEX5dz2lsZGUz2nbhiBViDHiTYm4dH?= =?us-ascii?Q?TIEqh5/KAB+7m9Cj3VNTmJkv1iHH4E3820OzNrlDf8eUgcvyhmz1h3S0TW7I?= =?us-ascii?Q?8lmXi7Xf5HME/Zhwh0ps3YvBON/eGXMDB8sFpFJVSTRkf+WnkqgjzXmeo84B?= =?us-ascii?Q?X+ZF7e+RpJzEmCH8SU9lxjKWZr0a+nMJET3q2XqaAlldHzujjRtS5F2RfJpp?= =?us-ascii?Q?kz7pLXN5AJ3KRgpbafaK1EFHFQenNu4/C8BBvfzl8I6x0SnDGR5DGOrhIqYI?= =?us-ascii?Q?ebNWZk1lJDRP2y/Q3Y28Mh/PoMoEvMeonsz+KkhJTe6CCgtll5QATcPuh+dE?= =?us-ascii?Q?BZ/OXrDHqrt1dun7J2WTB1/NCEIiuuRdDXIRow1GXeUSfDw/bM7Pmh+HW+0F?= =?us-ascii?Q?cQLEu8kMYNwDLww69gzKmSluJRxpQ7e5K+K5myAPUoXrvzHcygfDGHfcLSj0?= =?us-ascii?Q?26MJd70P+otDtq1J897efpSkbZjYk6aVyb5ONfbsju5+1puexsU7yxOGex0n?= =?us-ascii?Q?iTagXrX8WhUu8jsqWwtR8un0LbUviqdWMX/81TiN341RBn7JQmSwuXGRcVh2?= =?us-ascii?Q?cgqkOJ/ONWpRG8ZxbLeUS0DT1thsQRWbet5iMKC1VwTt7WrsqUO5tYFPE9i7?= =?us-ascii?Q?bRV2qQrgRjDOM9XPVZ+gUdwxqhlp5G9hMD1f8K1NWn+6u357Q/Z/JlIGFh0r?= =?us-ascii?Q?FDe+E5tEsgCiADcNz0wCv26T9nmpUHARihSzkfzCeyLJ8ue0hUwAAeQuIKpO?= =?us-ascii?Q?g6M3ak9ju9xtEwxBfZlJdbs7scXJsJMKiFm902yL+7lsF4Lm+Pzo2vtjiUbs?= =?us-ascii?Q?qJTXpVBXv1YXiCyQRMz1SkToesQts3tcCWZIlE/ADsWw3moeOHn6XiedfrU1?= =?us-ascii?Q?Cj74SlBKpuI1yp1dCxLkhkwRZ9Qy8BKnnEGfsIS+k0PZ/MUpn1F6rchPslZe?= =?us-ascii?Q?OWaQ/rr9cLM/QKrJzBA0FKU2D4DVxBVQkJE3LgCbbR3EbFOYEPLtkg6KVaZ3?= =?us-ascii?Q?MFYwzellfnrWdGhUIhvt23em4q8T8jLwrWy9eOk452cTUOBYyRRe74FFVSwp?= =?us-ascii?Q?TttOayvPKmHxCjrM6xx81XlQuT6ONOQuieVe8BKZf8TdHW8P4KM7b4FyRcQ5?= =?us-ascii?Q?7jJEoB3E2orV6ppsPzzYqMOjJ+fLT/V3rrJAYn1HixX9PTHtvUcwibn0m5Aw?= =?us-ascii?Q?fCTh5AE/2O8bjKSkAWHqk8/wQ8WOwfBY2u8j6VJGWgsC5OHZMiWTQOCRJ6TI?= =?us-ascii?Q?zAO5ouIKE+prVZPci/bgJe2q7C9KctO3xf3puDjYJB1D9kAW+B4p?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 3ed25f7c-2061-4a56-537a-08de5699306c X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:07.6112 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: GAG7aBHMErXrpHdya/wuvfe7joqwwK/g8KqG1SSFtDQixEU/sVsFliIS8w0P6NRsXk9SJu/ZegZcTR6He7VUOw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Prepare for splitting the transport code into a reusable core library and separate client modules. Rename the current implementation file to ntb_transport_core.c to reflect its role and to keep follow-up diffs reviewable. Signed-off-by: Koichiro Den --- drivers/ntb/Makefile | 2 ++ drivers/ntb/{ntb_transport.c =3D> ntb_transport_core.c} | 0 2 files changed, 2 insertions(+) rename drivers/ntb/{ntb_transport.c =3D> ntb_transport_core.c} (100%) diff --git a/drivers/ntb/Makefile b/drivers/ntb/Makefile index 3a6fa181ff99..9b66e5fafbc0 100644 --- a/drivers/ntb/Makefile +++ b/drivers/ntb/Makefile @@ -4,3 +4,5 @@ obj-$(CONFIG_NTB_TRANSPORT) +=3D ntb_transport.o =20 ntb-y :=3D core.o ntb-$(CONFIG_NTB_MSI) +=3D msi.o + +ntb_transport-y :=3D ntb_transport_core.o diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport_core.c similarity index 100% rename from drivers/ntb/ntb_transport.c rename to drivers/ntb/ntb_transport_core.c --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021122.outbound.protection.outlook.com [40.107.74.122]) (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 187EC332EA0; Sun, 18 Jan 2026 13:55:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744517; cv=fail; b=Bc4KZ2qjsbCOvjXm2a78xEEuTudwBP1DvXzGEQ1Qbnlx/X9FJGtcPEI7TcSyWpPLQxCzKOnLNxTKEdVuBPlIMdpZ86Zkeyc/ILaGfmiK4XfGCmiXZIxfVf/WBdvSmQnilYTRBHrMkZ9BJUuW7xzCxpyrDrRXZBDhTYOBJ+Zjqlo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744517; c=relaxed/simple; bh=psK8XV1Jf+m6hfSPEMDO2z4ZEQzD80YIuu/VBJGR4+g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=uFAM3BU6rsEP+JMZlbCkxOTEurVo31+dorb+8EVvTwdrB4bqokz15SvidIaIRfG1US33SqA9k6GkgQJzYbGTyJIxBBxypGlmNS5olybVMKVP7qC8uP9kd7NhPvoPj90HaSbOVXZIIysEODYRsyxl4RlNuwOdbBhtJcj41XuNpQc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=RzpnR/Dq; arc=fail smtp.client-ip=40.107.74.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="RzpnR/Dq" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=vWVZgXOZgYBccgbq2iDjcKgX4os40C/xfg+CadjihTXhHdj+kWv0vSDseyvvE2Xk3PUYYcVsAW9Di9zaEEM2ElaJexYtr8+6pV27ipXyYQF07jgkXfDFwGo+1yhyg3E7wdlAtuFCVfHxj9DWmOxTC9B+yuK32+is5lHHZtS2dTF708HAu9Dk+gGSvbF/doOFJKEQ3d25+RbjfcDvVTrE+qf+tMsmOt9PX/FckqkfkFSxEMUsreQlRZswIUvI2gGVtyh7tNHsi/iQ4SK8o7BmjMWDkTWlANihiaDHM3NzwsnDeVjTSl8bLWEetpQlZ7OkLE9Qt53oavON935W0MpO/Q== 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=GPAZ38OvBjz/v/kmg2tU3uhG7uM1sHadEjLyI6WgQO0=; b=UQyw/Svx1/pj7qh7RTSu3lPn65DWSspQiyHTkb+ONqm9p05qsXMapx5bbE2NULwLX99Ela0XtbdLIGczlcj0otRTadIWD7CNLuLQi0pG2haBlApOW6NqV+PXYbTKmVT60c7Coxpzz4VxZAnh4pzLiX7gJ4V0/MY5KkZ/2vpbI8uCCfE8WxBu+HJQIqKqEcDQ6swG8/cDunLo9oe2qmPy2GbddGypA26fkYmdtsZ4j7119eR5XtypjrObxHIU+hNHp4Fp/ErmvXaIA3BklXjimL5rilPIzsoiIwLY1n1XKQr+3SerMcc3s8gylyabs+3Rm0oD/wXbHJ+tOpJSw/KjrA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GPAZ38OvBjz/v/kmg2tU3uhG7uM1sHadEjLyI6WgQO0=; b=RzpnR/DqGnfPFwjsmTXmOEmu2e8LbpD50BL8yJNTI0pjm8AnJADDYxo+d7RKZodgC6GxuUYm6P4UlCMO2FV5ObfhVs+TpJ0RQwRmXD4pXJ8py6XxnU4TmwFBaeF9iQ/3uootlVJRgQjJU7yFoFiI9CX9ebOWxl4aTln+tD0KdIU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:08 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:08 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 20/38] NTB: ntb_transport: Move internal types to ntb_transport_internal.h Date: Sun, 18 Jan 2026 22:54:22 +0900 Message-ID: <20260118135440.1958279-21-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0023.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:2b0::17) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 28a8ee73-9767-4d60-8149-08de569930e6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?9peVkA0ZaYrD6O52xHt0OgPe5ud1aRyBD8Z7hdGcWK3KzlYqVUemT20Mleh2?= =?us-ascii?Q?wPHgs4cKPKwyxeldmM+fojh3cSzV5yzOlHYRywNipHa0fT7F+F+nrBwlujA3?= =?us-ascii?Q?EBVD1Ycv0zdKK6QB0QxXbApWBg2rNx5+SjNvwDKlEgFLfIu5f4nTtLwVcKZ/?= =?us-ascii?Q?uQltthLJ8mSWQAonDrQKLNacdJMFV8+93s+L3FbnbDfRs2z+xr76sVUXe9vc?= =?us-ascii?Q?a4g0ZPUdTWa7hcOVo6JBxNSxJq8F0BaDiargYNmH7IPAS3NNOj4TMJjCk9xS?= =?us-ascii?Q?VoEFZjSFtZ8RUqwXjTZlqO+10VxsmUDeH0BvlPj1hOzgshk/LPRuKNY+u5nU?= =?us-ascii?Q?8IvLhk6fefgGzwLqcJFjMbRk2fCjiIO+2cILCQ2IVtzzCsZQw4FrWiIci1AW?= =?us-ascii?Q?F2KUkH2gmnxGy4LQZg/eW/vDJX6rDITPqYZOsyzQg1HaCraW8gbLvi6E5Rq1?= =?us-ascii?Q?JcM7kICbhwkbZLYwvK7CpZOl7sspqPTcjDpqlXxofXgSGmk0gu1VukEL54EQ?= =?us-ascii?Q?Fp5WouPngCEL6fpQdz7tur9jlY1G1q4F0uK02x6m70kF54ulkhL1Cm1DZA1B?= =?us-ascii?Q?knPdYUAsq4RWgspeRZR6dFN4Jgr1JCEcWBd89ZHlNoP7om+lHwyi+cr7Rc8O?= =?us-ascii?Q?7xtNGXcKMeBB3qiT1xiJiaESNHursO8HX0IqgJU5V8EOGGC9MFciQB60iEaS?= =?us-ascii?Q?tkGP2Z/keOAwr8kbGlgPmYzHXe7I5iXAwLCcvyX5uQ6wMMGRSdBJLUWug/wn?= =?us-ascii?Q?TzZNtVgKHtEdvqSUptcoP04lu0IuNBbQ8oiVG6rSc9xK6zFsU+fQ3BA2arQF?= =?us-ascii?Q?SA1y9JbmkjWxJm8MZ5T8v/0N1luz4kxEnZaHCRPQo5DtSuOU76dIxK5uU/ZP?= =?us-ascii?Q?YX4Y7Mtbvg2aTJyKNMJg3GAUwppJxSrkV63f64XCedXoOKRz3WIuGudLAhY0?= =?us-ascii?Q?eqSDQkiyDancE9Iy/IPphNyfbOiXD91mE5y7xTsk+o+s3hmai+blhH+ba4z/?= =?us-ascii?Q?8EY2dWJ29V7f3fYWi7MHJKhdpm/npFJ475lWFnYuhYiQ2/wLRaBYv35yOpoL?= =?us-ascii?Q?DiH4nOSLRTSDUAM4CT/5VmQRkPiWjAMVtnIg1BuHo+ha62cxDAgQhZ5XPdjV?= =?us-ascii?Q?d5dXVQtxiASYI5TOQaGiTZyVHZvMnLx1FxFTURhSGeUv67MhcYsgLoCcfT4f?= =?us-ascii?Q?RsMWmniLZ4yqd+LorqyNStkpQPs3RQLaVX+VR54E+cAu2rUNmrREJFW65Ug9?= =?us-ascii?Q?IVOB2RoTWbMDQYXop+5qcMXmM4Y4pxBQauWyV3FL/4Udw4xrDc8LY48XTLGS?= =?us-ascii?Q?RCq5EYvZYmAR5Mc+VXrOUh0Ol2u9xt1ytpfdkUOes0K95MVO4OwJhsvr1k6A?= =?us-ascii?Q?RX7QF6uih55R+7kl+NkTBAfHA1sUPslBivbzSBIrk2mrmp8NBA6fFaiRZN3y?= =?us-ascii?Q?MifqeU1XkP0L6Gb4fgDUW7cIZr91+jmfuriF3/KiNhtag5/3qGczdt++Eyzx?= =?us-ascii?Q?Wt2NrE0meVskmlqTjnl4WGkON1sn/r+M/ksTNgQY9jAiPJkUBi6wSktCc/Wr?= =?us-ascii?Q?qHhvHGwanEkt+RvtJwiVAm0+tK88rOyLDW1IevucPqtumFqQzeTgxe5tf6WA?= =?us-ascii?Q?nQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?LTpJ0RgPhNC3FKfQ9W1OiY5Dc5U0lHTagcyCSKkdNcnFcP+fsWAowQe0YWnS?= =?us-ascii?Q?+5RpBEVrbmt+kEApP5OMhiRmDo8EJ+leOMBsIfFnbulIdSSLFqCT8nT6nNUW?= =?us-ascii?Q?8H2gRsjIKN4PHqQQDl3RjDxdbOI/lGHZY5eEXnCORlxcn/YHBNHOE0G2kOak?= =?us-ascii?Q?AhgC3P9xTubKnvL6dTRaxvqKtXeW5T2nD5/uHLHicEMfrJcZ/0sfH3KSgvDp?= =?us-ascii?Q?U+o+gmmSMzAtXLxpmHBm4R1eNFAzybRNXz6LsHU8gx3F4WU9s1/GB/qk989C?= =?us-ascii?Q?jZB6Ru6ZIVmaxdMJybyHXuaOgp+diKsZCckEAvyuCjJ/+ewkHFXpJFkIsy8P?= =?us-ascii?Q?teHFGcZ1AxvnF5nv4Lx3f+OKKeTj/x7i6gB2iZPzUNHAO3sDKrttU4Q1mamB?= =?us-ascii?Q?QOcsPc8AomZMOiyMNywU6IgNx8aMj9eklI2bkiXkgQNBpeVmITYIyGJUWhum?= =?us-ascii?Q?Asz83KAKEmqywwAHJIymJP5DNdqB760mMXgjz/7EpGGFFxFXkIJaQhGmZi3H?= =?us-ascii?Q?PzoRbotcRLHFXUdUTEkcsKHmL5WhEdU/YR7tS1DzwmGUkDlOwNvflX0P7SiX?= =?us-ascii?Q?ApXUwLSCcZUs5q5pF4Od2/Hrptk3rZ2uR9/S9SCVavWagAVjjgRZSrjgz4hf?= =?us-ascii?Q?YBvEnSZOpiQIQJ7WRkLINgTbWa5xn8nXlyy/kiNWpoNFbbbBubO8pDC39EqI?= =?us-ascii?Q?/n9emoNiD/zysFtAxikuYXmh1ML8xuBGGSE3nDuXedafQE8raUO/cz98iF/U?= =?us-ascii?Q?HsFtXEcpe0A/84eiNe//nlFsc82jN/drg+sBjDD4aV4OCVs0HJP0QJMWW/NL?= =?us-ascii?Q?EdISgsHN6LNco5cc2WvEyjJ3/dvUfT+8Hu4GITJC2ZmgGEKxG8rSLUrulxCI?= =?us-ascii?Q?l3IcYVSHucJ5W1bmoV5/vQqwwomMuyFZhXBxEsMhm+hS7wa8b0bTc+fSOrJ8?= =?us-ascii?Q?O6T6tdigPMXhAB/HGJuZ6Qdg+AyxXffBc0k9nlN163YDRb4E7Lfk+4AOc1Kv?= =?us-ascii?Q?fCeAuKlIM4faEHA9b1onGyfyJnsBcAxsqOtnbDKTj+ZZsIY3PTVSO3Cg9YuM?= =?us-ascii?Q?hTFOykAITt7HpIdqGQ4AOc6/GDZmw71KY31NDlBlA9LodHgzaipLzskZRdnH?= =?us-ascii?Q?8LIOp2L3HY8YL2ZR/VkRnCAaSAwB8ac0KPN/MeEwwXggQM0AP+YtjBkJwfgO?= =?us-ascii?Q?Y5JOOg3XBjJVEfE4dkwFJfYrVpPimzTB9D+/MOCGjRShYkJwb4C7mD2XH5ky?= =?us-ascii?Q?6odmm8GwozAHXy1CQcuSPrSXOWwrYPELbuvZyTlT4dJwDyMhciGg4GKelZ2v?= =?us-ascii?Q?FL75nLP6buk9uVjOiLEuwslLQQ0/pc/3zVqW581Q7Mve2P9HEgNzHPQS96LZ?= =?us-ascii?Q?kfyRq2XSa6jPcJlJ8yN4kHH8Cl2w6GYFWfUQcZzhpOi/ntsgIUZmR3LWQ6D3?= =?us-ascii?Q?OaYajVQUzfSgDB4dgVDlTSIO2qDSgq+cd7yO7i9+dlX+W/+P8VMxQ5R4atcK?= =?us-ascii?Q?o3zswOU7nkxCxTx2KnlkYGmcyci07hqvMVtGdKm741mJjHZyvQ8RVqEYvuVY?= =?us-ascii?Q?5JLJm0Dp3yI0ExdwMviO2jE9cmrEhIHN8phzEQHr3vsa5S6gJziyQ3TevdSb?= =?us-ascii?Q?LAt85OpOJqebzsUyNK6QYAqSQa/ThyoRg7KXj7FbPkXinXN84VE/jkgQwaV/?= =?us-ascii?Q?bgVW9AK3MB0fEjlLuQBNCS3Y5MbBy73ZJnEyG5aQhqN9lrlI59iBztsHHk2g?= =?us-ascii?Q?60Fzcfi4gC6QBS03gkb7jxjW/o9LJaQT+w816dRUcoa9UqcwTpFN?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 28a8ee73-9767-4d60-8149-08de569930e6 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:08.4000 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: zFYbUjZUWicuV5T/SquKYn/tzNo0SrOmB+OYY9QUBDslqxgs563lEqR7VJ4uJLHYbeUvXLAdz9HBRzkuKgUB9A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Move internal structs and definitions from ntb_transport_core.c into a new internal header so they can be shared by upcoming split-out modules. No functional change. Signed-off-by: Koichiro Den --- drivers/ntb/ntb_transport_core.c | 144 +----------------------- drivers/ntb/ntb_transport_internal.h | 159 +++++++++++++++++++++++++++ 2 files changed, 161 insertions(+), 142 deletions(-) create mode 100644 drivers/ntb/ntb_transport_internal.h diff --git a/drivers/ntb/ntb_transport_core.c b/drivers/ntb/ntb_transport_c= ore.c index 7b320249629c..71f01fa0ff05 100644 --- a/drivers/ntb/ntb_transport_core.c +++ b/drivers/ntb/ntb_transport_core.c @@ -64,6 +64,8 @@ #include "linux/ntb.h" #include "linux/ntb_transport.h" =20 +#include "ntb_transport_internal.h" + #define NTB_TRANSPORT_VERSION 4 #define NTB_TRANSPORT_VER "4" #define NTB_TRANSPORT_NAME "ntb_transport" @@ -106,153 +108,12 @@ static struct dentry *nt_debugfs_dir; /* Only two-ports NTB devices are supported */ #define PIDX NTB_DEF_PEER_IDX =20 -struct ntb_queue_entry { - /* ntb_queue list reference */ - struct list_head entry; - /* pointers to data to be transferred */ - void *cb_data; - void *buf; - unsigned int len; - unsigned int flags; - int retries; - int errors; - unsigned int tx_index; - unsigned int rx_index; - - struct ntb_transport_qp *qp; - union { - struct ntb_payload_header __iomem *tx_hdr; - struct ntb_payload_header *rx_hdr; - }; -}; - -struct ntb_rx_info { - unsigned int entry; -}; - -struct ntb_transport_qp { - struct ntb_transport_ctx *transport; - struct ntb_dev *ndev; - void *cb_data; - struct dma_chan *tx_dma_chan; - struct dma_chan *rx_dma_chan; - - bool client_ready; - bool link_is_up; - bool active; - - u8 qp_num; /* Only 64 QP's are allowed. 0-63 */ - u64 qp_bit; - - struct ntb_rx_info __iomem *rx_info; - struct ntb_rx_info *remote_rx_info; - - void (*tx_handler)(struct ntb_transport_qp *qp, void *qp_data, - void *data, int len); - struct list_head tx_free_q; - spinlock_t ntb_tx_free_q_lock; - void __iomem *tx_mw; - phys_addr_t tx_mw_phys; - size_t tx_mw_size; - dma_addr_t tx_mw_dma_addr; - unsigned int tx_index; - unsigned int tx_max_entry; - unsigned int tx_max_frame; - - void (*rx_handler)(struct ntb_transport_qp *qp, void *qp_data, - void *data, int len); - struct list_head rx_post_q; - struct list_head rx_pend_q; - struct list_head rx_free_q; - /* ntb_rx_q_lock: synchronize access to rx_XXXX_q */ - spinlock_t ntb_rx_q_lock; - void *rx_buff; - unsigned int rx_index; - unsigned int rx_max_entry; - unsigned int rx_max_frame; - unsigned int rx_alloc_entry; - dma_cookie_t last_cookie; - struct tasklet_struct rxc_db_work; - - void (*event_handler)(void *data, int status); - struct delayed_work link_work; - struct work_struct link_cleanup; - - struct dentry *debugfs_dir; - struct dentry *debugfs_stats; - - /* Stats */ - u64 rx_bytes; - u64 rx_pkts; - u64 rx_ring_empty; - u64 rx_err_no_buf; - u64 rx_err_oflow; - u64 rx_err_ver; - u64 rx_memcpy; - u64 rx_async; - u64 tx_bytes; - u64 tx_pkts; - u64 tx_ring_full; - u64 tx_err_no_buf; - u64 tx_memcpy; - u64 tx_async; - - bool use_msi; - int msi_irq; - struct ntb_msi_desc msi_desc; - struct ntb_msi_desc peer_msi_desc; -}; - -struct ntb_transport_mw { - phys_addr_t phys_addr; - resource_size_t phys_size; - void __iomem *vbase; - size_t xlat_size; - size_t buff_size; - size_t alloc_size; - void *alloc_addr; - void *virt_addr; - dma_addr_t dma_addr; -}; - struct ntb_transport_client_dev { struct list_head entry; struct ntb_transport_ctx *nt; struct device dev; }; =20 -struct ntb_transport_ctx { - struct list_head entry; - struct list_head client_devs; - - struct ntb_dev *ndev; - - struct ntb_transport_mw *mw_vec; - struct ntb_transport_qp *qp_vec; - unsigned int mw_count; - unsigned int qp_count; - u64 qp_bitmap; - u64 qp_bitmap_free; - - bool use_msi; - unsigned int msi_spad_offset; - u64 msi_db_mask; - - bool link_is_up; - struct delayed_work link_work; - struct work_struct link_cleanup; - - struct dentry *debugfs_node_dir; - - /* Make sure workq of link event be executed serially */ - struct mutex link_event_lock; -}; - -enum { - DESC_DONE_FLAG =3D BIT(0), - LINK_DOWN_FLAG =3D BIT(1), -}; - struct ntb_payload_header { unsigned int ver; unsigned int len; @@ -274,7 +135,6 @@ enum { #define drv_client(__drv) \ container_of((__drv), struct ntb_transport_client, driver) =20 -#define QP_TO_MW(nt, qp) ((qp) % nt->mw_count) #define NTB_QP_DEF_NUM_ENTRIES 100 #define NTB_LINK_DOWN_TIMEOUT 10 =20 diff --git a/drivers/ntb/ntb_transport_internal.h b/drivers/ntb/ntb_transpo= rt_internal.h new file mode 100644 index 000000000000..aff9b70671c6 --- /dev/null +++ b/drivers/ntb/ntb_transport_internal.h @@ -0,0 +1,159 @@ +/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ +/* + * Copyright(c) 2012 Intel Corporation. All rights reserved. + * Copyright (C) 2015 EMC Corporation. All Rights Reserved. + */ +#ifndef _NTB_TRANSPORT_INTERNAL_H_ +#define _NTB_TRANSPORT_INTERNAL_H_ + +#include +#include +#include +#include +#include +#include + +#define QP_TO_MW(nt, qp) ((qp) % nt->mw_count) + +struct ntb_queue_entry { + /* ntb_queue list reference */ + struct list_head entry; + /* pointers to data to be transferred */ + void *cb_data; + void *buf; + unsigned int len; + unsigned int flags; + int retries; + int errors; + unsigned int tx_index; + unsigned int rx_index; + + struct ntb_transport_qp *qp; + union { + struct ntb_payload_header __iomem *tx_hdr; + struct ntb_payload_header *rx_hdr; + }; +}; + +struct ntb_rx_info { + unsigned int entry; +}; + +struct ntb_transport_qp { + struct ntb_transport_ctx *transport; + struct ntb_dev *ndev; + void *cb_data; + struct dma_chan *tx_dma_chan; + struct dma_chan *rx_dma_chan; + + bool client_ready; + bool link_is_up; + bool active; + + u8 qp_num; /* Only 64 QP's are allowed. 0-63 */ + u64 qp_bit; + + struct ntb_rx_info __iomem *rx_info; + struct ntb_rx_info *remote_rx_info; + + void (*tx_handler)(struct ntb_transport_qp *qp, void *qp_data, + void *data, int len); + struct list_head tx_free_q; + spinlock_t ntb_tx_free_q_lock; + void __iomem *tx_mw; + phys_addr_t tx_mw_phys; + size_t tx_mw_size; + dma_addr_t tx_mw_dma_addr; + unsigned int tx_index; + unsigned int tx_max_entry; + unsigned int tx_max_frame; + + void (*rx_handler)(struct ntb_transport_qp *qp, void *qp_data, + void *data, int len); + struct list_head rx_post_q; + struct list_head rx_pend_q; + struct list_head rx_free_q; + /* ntb_rx_q_lock: synchronize access to rx_XXXX_q */ + spinlock_t ntb_rx_q_lock; + void *rx_buff; + unsigned int rx_index; + unsigned int rx_max_entry; + unsigned int rx_max_frame; + unsigned int rx_alloc_entry; + dma_cookie_t last_cookie; + struct tasklet_struct rxc_db_work; + + void (*event_handler)(void *data, int status); + struct delayed_work link_work; + struct work_struct link_cleanup; + + struct dentry *debugfs_dir; + struct dentry *debugfs_stats; + + /* Stats */ + u64 rx_bytes; + u64 rx_pkts; + u64 rx_ring_empty; + u64 rx_err_no_buf; + u64 rx_err_oflow; + u64 rx_err_ver; + u64 rx_memcpy; + u64 rx_async; + u64 tx_bytes; + u64 tx_pkts; + u64 tx_ring_full; + u64 tx_err_no_buf; + u64 tx_memcpy; + u64 tx_async; + + bool use_msi; + int msi_irq; + struct ntb_msi_desc msi_desc; + struct ntb_msi_desc peer_msi_desc; +}; + +struct ntb_transport_mw { + phys_addr_t phys_addr; + resource_size_t phys_size; + void __iomem *vbase; + size_t xlat_size; + size_t buff_size; + size_t alloc_size; + void *alloc_addr; + void *virt_addr; + dma_addr_t dma_addr; +}; + +struct ntb_transport_ctx { + struct list_head entry; + struct list_head client_devs; + + struct ntb_dev *ndev; + + struct ntb_transport_mw *mw_vec; + struct ntb_transport_qp *qp_vec; + unsigned int mw_count; + unsigned int qp_count; + u64 qp_bitmap; + u64 qp_bitmap_free; + + bool use_msi; + unsigned int msi_spad_offset; + u64 msi_db_mask; + + bool link_is_up; + struct delayed_work link_work; + struct work_struct link_cleanup; + + struct dentry *debugfs_node_dir; + + /* Make sure workq of link event be executed serially */ + struct mutex link_event_lock; +}; + +enum { + DESC_DONE_FLAG =3D BIT(0), + LINK_DOWN_FLAG =3D BIT(1), +}; + +#endif /* _NTB_TRANSPORT_INTERNAL_H_ */ --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021122.outbound.protection.outlook.com [40.107.74.122]) (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 8ADDC337694; Sun, 18 Jan 2026 13:55:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744522; cv=fail; b=RwRP+gKOiMIzMR3fOjHbjsL/tF4GKV+e4e+X/zufETdDy0qAI90eF9BhXfinALshQ7nr3cPEtjPzGdndtDVam+us/n/047LxwS+DcJWgp/2q2CwYSFwqp+xG0Mma6KWGiB2yFl2hDxNNzaShJb013tyLB2NN6GgXd2KeKbodGiI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744522; c=relaxed/simple; bh=IqHFWJSuGvj6r22CuJXevKZnus95/9vGeu4ZTRtzxKM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=owxS67DOOFBLsJNrY06BTzIFAfCTx0B1fCfqzzA25e19D2FD1/mApaHf4oGM0SxCoxGHlXhxhjIDacIJA3VKf3+wFqpRY7UhoFaGE+1ZGPFYWWG8SomOZZ40OYSFz+18U0pLk9xRHNGLtOVYkSBdcEX0NHe2GB07vmlnv1LFwXY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=tV5K3wFj; arc=fail smtp.client-ip=40.107.74.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="tV5K3wFj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Gjby+5pggSMDh69dKa3rIxfTu2zyMiHXWKeOVUNC+XLGKgPusReblOv6iDk0Rp0OjjTB4Sa/8KaVlnmhchgWoDvkodXxTXSxlWB+9ZAuyA4yOBEzdM/Uk/MHKMvA4P1/hKrRcarSMTP9rgD+cmFM8O3eLUBw4jzCEZ8nd04pqYO/IcEjPXb77K8uUWnVjNNpKSnZKTyzaCn9GTwZnsdkR5U738+RkCGqgryDGzrCtvV7ssecxcfVpecJv13ndJxgVDWwVWELOQSqnDXoPB6WVQwR3XQFEzd7eDnA1wdwraTLtc9UqtzUl8Gopc5lEMr9o0PObVPFipLuN/VoNikWZw== 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=mFYiyTPMquoLyl/d26zlE8HHBOkav4JJ0IvYZIGL8Iw=; b=E8teBkrw7acEq0CEHVc3V1m8+9ijambr2busm50F0Muw7/fCZsq4lgymDYtkF/PyRpRlSyIWlaitWMbFG3NtS2mGK1yG3pLUL0SnAJW34UpxZOTnInSL+pPXn3cw92dd023U3czgbKI/jwR7+UBd8wsBiOVCQsLmbyFwS4OydBp8bPrGTYTACWslRqi0g+AG/vXTLcQF9cTENo3nGergzoMfoBmRPrAlDOikzwLKR0IXHv0vZub+lYGyKF0wIQs1KyDDjho59DlgXyJ473YxihjRY9elKnwzW2Xcs9h0462D4ywGtG+72QH8NXxsFAE1dKFkU5A42vHmBYqG5Fo61Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mFYiyTPMquoLyl/d26zlE8HHBOkav4JJ0IvYZIGL8Iw=; b=tV5K3wFjMnUKJrOhEJfSnYnEwBMRd9hlJIVKxGKBn6REva5pJyz6PyqBecMATkzBH2qLEeRXYmnnQi/6bOqIv2+QR7rD4BRqv6+1j1XQpCqhVPcyqNbjWU36h+H2cYD0Z1ZnZIFYbh2wiA27Ik1HBtyJHbDK8WRa7UGUtT98Lio= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:09 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:09 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 21/38] NTB: ntb_transport: Export common helpers for modularization Date: Sun, 18 Jan 2026 22:54:23 +0900 Message-ID: <20260118135440.1958279-22-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0102.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2b4::9) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 3dab20e7-a727-4cd9-cc97-08de56993156 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?WCUt8o2P3J0wefh+3MbVqWW3Yw6EO1UhrXyurcprWX4qXJ4u9F0ghc+aHkgQ?= =?us-ascii?Q?Qji9srdKiHVImUOrMeL80sImLef9kE+3yL1Ss1rRguDoWrizHzJVlkh5qNpJ?= =?us-ascii?Q?k9HcBLMQy0G9SMH0P6cItk5+DvBTXFJ/sEdUt8NZyVLUM5VnSPh/xc1y7UjR?= =?us-ascii?Q?BhLSvk1njHtMNVnH1KQUoWMxlDyjB2CRGTuqIp77NlWV8ls9OSeyXJOaBW/y?= =?us-ascii?Q?5kBsslfOEZSmnr86jcZwcbN97ePYGHGuFObnbmwEB7XVF42ZVms4/5kMgcWn?= =?us-ascii?Q?Y7SsKOZdrdsm3ljD52z9ByGYf0dalddWNuG8NkZEqcegPxLYWMfm268kh/Qt?= =?us-ascii?Q?+MFU2+5PDHxkbZt9Hu6uhJeXB+cGmCv9WimyNEA7V7TrlAU6Iwx3Wj3P8MEl?= =?us-ascii?Q?OV1YJ+Yj+wapBUWSQI2fuEmuueMZU6uxe+WzIKB+0v5wK9tWjexO/VljSTJn?= =?us-ascii?Q?W2kxI2akXwyi3LR2ABpfrDb3tPWkYtyTqKnRbpXpv8l7Imaz/zbtdMwBzIN8?= =?us-ascii?Q?6exJOVTZu/dDzJsVl4pCu6FAK8+K0DRnuG+XUGHp1GVNnbTOcT2PhEKWfH2p?= =?us-ascii?Q?5ZLW+A/74FusbrxU2h9TDp1Fcc0Gtv292ZFYpQDJvIvcSpV1K+9Choq/5mhf?= =?us-ascii?Q?IaxMhXp06Q1Eezrq+a8ubdhdWp8NZ+dp0OQDkHhqU7G5zwSmMk/oyM5ArJbW?= =?us-ascii?Q?RSvB0O4KAZoMoszrvIxrXmbEWgcnvoqul9pes2o9IsI2HYDbdac0pCKN3oGS?= =?us-ascii?Q?qlaeZq/I7vWzuCS0uZjDBLTS0KuurYyfqeJNvp+XtVcmyDicvSOFDIxTco5/?= =?us-ascii?Q?ft8DEeZW1WX5ZlweWCb1rFQMJO4SD2pRU2LDbNCtPg794Xj7Vznf5ojrlnIW?= =?us-ascii?Q?zpfbljLUNJda4hrOIrdn8mK4aKkg6MEHYu4LvDYFWrNZOBYV4XkK+LOk2vqo?= =?us-ascii?Q?fzYHprUwN0ZP+hRdGnRHPaZIMhYHsi3UTPrD0GCsnmRgnuKPpi3o7HKnm7Ta?= =?us-ascii?Q?wIYcLVz4AvBZANUL+0eUrXveuXnlb8u3Fjq95Aaei4x3mQn+YIXJ0Oz/WY8W?= =?us-ascii?Q?BjgbR4ObIcXel0bCDRArPaBLUZssZYdtLZqac23XwWtJE+FYYQynxq8TFKkm?= =?us-ascii?Q?R/bBXDW9ZQ3CibfCmzH5Cc7Rh4GtlRNmlBtglfh3CfHX2Kte88bkX3z5OQTI?= =?us-ascii?Q?84oKf0pkXdVQDO+wm1YdWZkCMwI0o5EtolPDF8VZgswvG+grukDzkUOh9h8v?= =?us-ascii?Q?AYXeauocUZHm6imKrkRE5gbPPZIoPnvKciRUd3CK8RXF3ahMGcAoz1xuHkU3?= =?us-ascii?Q?gC4o9+yy96NCHOvozfk594hHigKZVQPRtMHPix3CzKV5N1jc0PymgOBi1x/l?= =?us-ascii?Q?cp2nU7XarfKOEGltJlcV5CT/cd0R7Zeu90qW8CKVlYR1sW8oWm5BvqakLief?= =?us-ascii?Q?GJ53SbrWCmNPgv5yh106ku8+u8+UGJAyTK2tVrB5OfGw0pEHVMNh10vcL9ce?= =?us-ascii?Q?YzsnavLlWPMCp8L2hoAfelQfDvzLzkTdz+Mc4fX4VF/eOKJ1OsjoHmTlknrE?= =?us-ascii?Q?ct92sruojjQYlFi5lNnSSgZrLe7gQWY7Xdszsuf7EsmUP9U/Z3gAKeVGniFr?= =?us-ascii?Q?eg=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?SNYXYj9PaUAfZtZD/AdqzZJ6F3BFjwCKZHVC7Fkqt9MRv0AKM4hTHOpD+GFb?= =?us-ascii?Q?rD1TQe+4nHfcj4WzW9SvyfZ/Veyu/6xMfuZaTTfuRl78i8Ew7kVRfkSWwJ6l?= =?us-ascii?Q?smwOVqkVeNvM8M5ku3lofMjkN7Hqz/tHpYPtA7u5bGSbEcX9QIJgE/a5TOo/?= =?us-ascii?Q?pWvw1tCSylDA8TyLCYDkcVR30y63nlGaAzHqeKchU1jP0TNno6pSMIDPKXs3?= =?us-ascii?Q?/ZRI854WQe1t79TtoDeFZx6fcxbPV8GajL2HRQ541D18PzBicg8vlSpxksD6?= =?us-ascii?Q?r85wzWUN3DabN5/b7RxL6e/sEIGHCYX4qw4QQs4nR7HhWFd1G10Hr+WR7lI1?= =?us-ascii?Q?CWA6Bzpe6XmwsWBNw4qJbZT9SWDkLdx5tqTAmBY1fUx56ZX8VPa84MiUpvQe?= =?us-ascii?Q?829zKR2KpBnc5il2xdaK0TRjmyusMAAFoUXNHVcLX5zR62OBGFv5zkfgwy8o?= =?us-ascii?Q?+9SHs5lzGH6KarbfTxbZRfkIv0IJCuyplaKjCAbeU8ep9Fa4n1NPC5jgS7lW?= =?us-ascii?Q?bbxaZoF8h2i9RoEJny+Vrg3yqKECmTu1BKgiHoNFglFUquqvdE0VMUu7sfZm?= =?us-ascii?Q?FEunOivvD0+BpnK4yPsnaV3XWVTGnI7raVzORJEwTm/+nyPtEhOw1Mq3hBEX?= =?us-ascii?Q?SCWB2bLUi4OG45uILUbAR+6Ca9knb+A5t7hcEvfx6w4qROrgBG7JCKK9cbLO?= =?us-ascii?Q?YCZu3jk4k0DMzBJfkwfFHZqiNWK+9ZgDK7+0okZJ4H6mSygoURVLLyoCBMfk?= =?us-ascii?Q?ID/fJE4fVWhDdZmytZopy0hlCAKC65oJp8B1DLwC7FeOYxzDaEyInpYxBMqa?= =?us-ascii?Q?QwB4UsRaLFllKEmKCYEsJrnIXab0pFmf5Z339G7iBdnsY3kBPo2BYON8OUVi?= =?us-ascii?Q?Hpo5BLAXYpMbJC23i3fEHFYYF9/Tz06MYxa9w6MYoC74r1saY2ElDJUZr9xW?= =?us-ascii?Q?yQPWMkuVy8ckuojV1kxBDDzMTGZ/B46RXOFjVpWl3wZzEvy8TDasL5CNg6aW?= =?us-ascii?Q?I/u5x8v9sTlZc0XOjEEdXkxWM6azrF53i/MuWIWzb7EiKcqvRFYGHpkcv6kc?= =?us-ascii?Q?jliUL3ik+fwHkcu+n8S1/nTh2SCrTlET3jPF4tlijYNpOywA44cgVQTKBt0z?= =?us-ascii?Q?GrTcjvsz33HwZbR3HF46Vy3dXwTp1v9viJvDz4h81TQ76XuyAzhqrtJLMtdp?= =?us-ascii?Q?dtXK26gmTkO8qdSj+6EcK+t3jkIrvYnNmg0uuN5WfP8uzOZBq/KmC9j1MaNj?= =?us-ascii?Q?hINqTvSNgVThc9eMYCzkkNOXLPhj6eKAUhaQz2ROVAyvHzKcOVroUgbdD56P?= =?us-ascii?Q?LSJ20m3BixZmUDvS9TvsMDK0GFY1fZ++hgQmossJdvq8/sfNbsmyxSV8z9vz?= =?us-ascii?Q?cY60eW0sXtMHvKDK8PlFguECgGEfnGnqkH/PH6yijzKpfcProuUDyKORQvHz?= =?us-ascii?Q?upB2ZtruLN24ee73oOua1ZiFoXcfHT8sVOcUhP+aeQYS5+fx0ibzy9V5Q1QV?= =?us-ascii?Q?lWcW99FexQz5xouSHHGTeRxWX8vA4+Jnl3ztbn6ZJfsN/aVuO/QyW+MsoXVy?= =?us-ascii?Q?2jLSiYfJUZ8GvP0fcNNl8cRxcvlj1scMGWQNKOma7PLJlhnIyFQzCFvL2aYP?= =?us-ascii?Q?MPB5p1SXftO/WTJW9SF7nNLxDHPNvylcz+b6apmpw5OMqU9cQinF/qZd7Y3w?= =?us-ascii?Q?Kng/Bt2HoSjq+p6rh4fy9hmHfEDW2zcT6EDyRWlfV9csqD6UL4X5AUPE9WZV?= =?us-ascii?Q?WO9kpFAiV0HB466yNMLCVTi11zl0cduhY+kx0CbK6YGGdMcri3CN?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 3dab20e7-a727-4cd9-cc97-08de56993156 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:09.1418 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 2a3wH9P2pnrW1wMHB1n7xtVnuC3qns3dLly2DzMDqtqJRBRcSZcM+wkP+C6biIY12DrGgqtvfOGdCyuNC+JOkA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Upcoming changes introduce multiple ntb_client drivers and transport backends that share common list/queue helpers. Export the shared helper functions and declare them in the internal header so they can be reused by split-out code. No functional change. Signed-off-by: Koichiro Den --- drivers/ntb/ntb_transport_core.c | 17 +++++++++-------- drivers/ntb/ntb_transport_internal.h | 7 +++++++ 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/drivers/ntb/ntb_transport_core.c b/drivers/ntb/ntb_transport_c= ore.c index 71f01fa0ff05..04a13fdce71c 100644 --- a/drivers/ntb/ntb_transport_core.c +++ b/drivers/ntb/ntb_transport_core.c @@ -371,8 +371,7 @@ static int ntb_qp_debugfs_stats_show(struct seq_file *s= , void *v) } DEFINE_SHOW_ATTRIBUTE(ntb_qp_debugfs_stats); =20 -static void ntb_list_add(spinlock_t *lock, struct list_head *entry, - struct list_head *list) +void ntb_list_add(spinlock_t *lock, struct list_head *entry, struct list_h= ead *list) { unsigned long flags; =20 @@ -380,9 +379,9 @@ static void ntb_list_add(spinlock_t *lock, struct list_= head *entry, list_add_tail(entry, list); spin_unlock_irqrestore(lock, flags); } +EXPORT_SYMBOL_GPL(ntb_list_add); =20 -static struct ntb_queue_entry *ntb_list_rm(spinlock_t *lock, - struct list_head *list) +struct ntb_queue_entry *ntb_list_rm(spinlock_t *lock, struct list_head *li= st) { struct ntb_queue_entry *entry; unsigned long flags; @@ -400,10 +399,10 @@ static struct ntb_queue_entry *ntb_list_rm(spinlock_t= *lock, =20 return entry; } +EXPORT_SYMBOL_GPL(ntb_list_rm); =20 -static struct ntb_queue_entry *ntb_list_mv(spinlock_t *lock, - struct list_head *list, - struct list_head *to_list) +struct ntb_queue_entry *ntb_list_mv(spinlock_t *lock, struct list_head *li= st, + struct list_head *to_list) { struct ntb_queue_entry *entry; unsigned long flags; @@ -421,6 +420,7 @@ static struct ntb_queue_entry *ntb_list_mv(spinlock_t *= lock, =20 return entry; } +EXPORT_SYMBOL_GPL(ntb_list_mv); =20 static int ntb_transport_setup_qp_mw(struct ntb_transport_ctx *nt, unsigned int qp_num) @@ -820,10 +820,11 @@ static void ntb_qp_link_cleanup_work(struct work_stru= ct *work) msecs_to_jiffies(NTB_LINK_DOWN_TIMEOUT)); } =20 -static void ntb_qp_link_down(struct ntb_transport_qp *qp) +void ntb_qp_link_down(struct ntb_transport_qp *qp) { schedule_work(&qp->link_cleanup); } +EXPORT_SYMBOL_GPL(ntb_qp_link_down); =20 static void ntb_transport_link_cleanup(struct ntb_transport_ctx *nt) { diff --git a/drivers/ntb/ntb_transport_internal.h b/drivers/ntb/ntb_transpo= rt_internal.h index aff9b70671c6..6b45790cc88e 100644 --- a/drivers/ntb/ntb_transport_internal.h +++ b/drivers/ntb/ntb_transport_internal.h @@ -156,4 +156,11 @@ enum { LINK_DOWN_FLAG =3D BIT(1), }; =20 +void ntb_list_add(spinlock_t *lock, struct list_head *entry, + struct list_head *list); +struct ntb_queue_entry *ntb_list_rm(spinlock_t *lock, struct list_head *li= st); +struct ntb_queue_entry *ntb_list_mv(spinlock_t *lock, struct list_head *li= st, + struct list_head *to_list); +void ntb_qp_link_down(struct ntb_transport_qp *qp); + #endif /* _NTB_TRANSPORT_INTERNAL_H_ */ --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021122.outbound.protection.outlook.com [40.107.74.122]) (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 9601C334C11; Sun, 18 Jan 2026 13:55:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744529; cv=fail; b=Mz+b68/pybVhppnzlglnCf4NZzqwMOHN2t1du+OxnDE2gtsQrT0P58Z9LcyRWoO/GfkJCbIliuniBpqRvL3yIpeVEakpTn4ZT2p1EVrFmlxEWDAb29jk9iZRtAeRBJA/fnLsVOd4KEizP//z2Hi13Zn+j6n3viCftFxPUSRwX1U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744529; c=relaxed/simple; bh=JvKmW7ZssHBp5C2XY00R1o5zga6ehzCwLe3nWFQHBEQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=E3WcninqvpBnk7U7vP9QmDu69BAx/MsRfr9gpxZYjcSZeo089sTsRTEB4wsmkxNLlDaY5iDjBa5l6XPfgok/4SL7uO5n8QsrZkJX7hkwRqsQzKqeSOKuYxvgJD2laZ2GAUECat8RMHScRmHGWEJVnjJqG9+L5d2HO/SJddP+GDo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=tjcBv6Ty; arc=fail smtp.client-ip=40.107.74.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="tjcBv6Ty" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=H6RExKCuHGRQfpBlrSVKPPhMWaH0rc86lXehMcGqnXZ606vaCDXcWlRJkcaLs/BIdep7vPNii5luqX8t0L906kyR1l+OGJFsQrWt9DQ+DbrussB4ew4DSFlL0a4juf3nkp+YxkrNKKbBR6BZFOwbdN6au6WMZzk65lf11gVwfBGDipOV6l64UafbguT0BcHs3sBxR1GWYCj9mTlpSWyDR87iqTq60MvCRcQ8DslUn1Rifz4pY2CSudKP8O9BbZ5nUJ73xyRciQsWMtMXdydXY4d2jf8YrXUtRFM855BFJDfBNE0vFQ84kSz0iEhv6mKvpQfNf0bOJe7YHJIvUEl6yw== 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=zswC/WL1m+0wWV0erwBLM9QrWKu3KjjqN0lYeTSaMbk=; b=uvSvyXYethlG/w/PtPhO47/2mTMOkUtACJjN5XMQTRwlUFdkJ8z9FgiOMlqU/d9XJTHUU97U9/wF6ka+UtQNWpRAyRoy+lnY26fF5k7ucLogZ6eRxsTJy6neKxYmIZjHAMEUQne3/X5A8pwiobxafsbFhABjaDNIASThi2kX11lUQi4q2LNI0uMHoBoL/ph7nyQB9ZLL/YBe2A/xg9IY+z6FCsT5mEjYRwHlFVJYCw2JB4vFfd3mKJpeEdDQRQ1KWO7WZj8LDJsKkL98kiS/cw2r0tO/m1kBCXLqPaB60pBrQjUNoYvivmFXKbZPQErQNUppQbmG9ilhY9eOBAtNcA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=zswC/WL1m+0wWV0erwBLM9QrWKu3KjjqN0lYeTSaMbk=; b=tjcBv6TyAZ1rVo0Y2hTtYNt5hWDQBFYL/CKezdYRa+G5X4GdL6AC8vKlWdWkLZUzI83Zpc7S2rHr0Afl6YCZTgCZyEl3TZu1UYBO08iEfFMibajwr70J1+nygOum4MhBnzv2b41TPY7gcHT0wTgfGAwnE7S9A0TviURXAZ78F6M= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:10 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:10 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 22/38] NTB: ntb_transport: Split core library and default NTB client Date: Sun, 18 Jan 2026 22:54:24 +0900 Message-ID: <20260118135440.1958279-23-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0044.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:29d::17) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: c01f8d4b-7e78-4607-335f-08de569931f2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?FPiF/Akjze1wlbzLSjxYXRo54tzmffN1pu8ryBavLvCS053W25YPfpMjar0f?= =?us-ascii?Q?bXgZYPftfFq/oglKxh3UvbiInTm177kiIfgMIATAdFnBy9Bif0D5MJa68tFg?= =?us-ascii?Q?/q4DiVfJAgFtjIQ3W99VvL2DFHQge6ZOMKlHnK4WgNwJzQv0yveN0yixFUxq?= =?us-ascii?Q?5DionEcSoOGM1Z+YaYBvxV19UKwnqCQWgrIMr2kq5oOXqcleQuhvQrNnvXM5?= =?us-ascii?Q?651O+CFbTsrxXPhBC8aJBgzu0tp7nhjaRIPI2QuHTQy+4BaDqV8vaunufjpw?= =?us-ascii?Q?pPozk7KaFwQuke0FMyactS7nYwYU0o+3m0K/PVy/szXmb1xM8Fcag+BJPpYX?= =?us-ascii?Q?rEJT6gu7hBz+WyILwa9yBp+VMVnuIEmBy0x3OpApe1XEh+VVX4k6eG3dcoRx?= =?us-ascii?Q?wlXOPOWnwdnqWHDVbTkh9iPsUNUgI1fcN/EDWIL9/Xt/+e2YJTwGBB0BKv+Y?= =?us-ascii?Q?6mr+wzHyWGgOGRgGF+tsu6j5hTkJKu2PFv+a9D3JS/4GS8AEu7uJ1l2tTuTN?= =?us-ascii?Q?34Xx2n1p5YmkeroojJwZyXO0tJiRywbJl+amsWVolsXRe2pG3EwI+VfEreCl?= =?us-ascii?Q?4qmZcNFFXnBtTQ3QWmkqYuxqX9ppGQn6hDccdZZXEni60GOido0JXUc6aCsv?= =?us-ascii?Q?7ySnTy4uJTZtP73EoLBd+iSkfKbKAHZtLpZUkkRTQEQTH00rno1IZFeH0LY/?= =?us-ascii?Q?eHpxWC75dWYCDoKtsRnI5y4A6eCBvB4nrBE3R5GMuXhIONwyn+3NXPqcwmYP?= =?us-ascii?Q?hiUuaOTtX/QJbo+/zvT6//Wv0dwQDyO4ntAPPCs7xVJgwowNuoqky0+R/xde?= =?us-ascii?Q?EPoik7OkHhcPcPfW7n3fGafy2/igxlYdBpQrjeNtK+e1/Cm4PTGdXw2VINBO?= =?us-ascii?Q?7HFntAoRzyvG11KAD4ee6VTKbFzfwaT6ZIlaZqabcdL8a60FnZK+dCMObRU+?= =?us-ascii?Q?ZZZBBuGNMXGfW0eY263uQujAp2gIAcl5PiQPRZ1hhglfw7rbST54z/ITsuoF?= =?us-ascii?Q?n5npiwNO0m9FbiRHFkjEs1zWwy/aoYu7c92fj/PYphyyOQXoTa2IIZ3xhrRH?= =?us-ascii?Q?2WCqTfrM8lNWUckSCkBZREoZLU4TNpfVhSNAR9FecgybulugJYLGqdG3kC2h?= =?us-ascii?Q?4ctiQqwlqbRNi1oPXb5n6UlylLAjgjDuJ2rP+lWDP755ZRYdBR2mO2/rjJvO?= =?us-ascii?Q?eGWpPI3prIIE91B0fRsXwprCdOyTCU0KrgQjrV76ht7+6fYGr2XqWZ+8wSWD?= =?us-ascii?Q?yb3LK9xiNP7zUeVmoJgi/T+Ec2qu7tT7UWkDDxfNqh1LE//npzz/Nxa/ewHZ?= =?us-ascii?Q?sYcn+L6yPcoFGAdLZTYv1K9b1uOsdkFNO/ILPynBBK0WLjJHj+e7MiPC+IBm?= =?us-ascii?Q?B/cso8cuRovbyIQZ6wgOC+yQYff6WlDwVeLxd+pIy47U6pDvW1Im62TsrX00?= =?us-ascii?Q?tH69i8AOC5gmcrWyckmJBz1xHsW60wrRTFIeN1QD4dZy1kEOz3+mUeYY93i/?= =?us-ascii?Q?8QKhgv/nA4ashFa/2APzm/N4imzLWor3vEeMtQqhBBZmnIOSTPMD11SS02xF?= =?us-ascii?Q?7B9vXQUlHmN/u2bhuFglPUctKnXH0XUdG4ZqOpzi1qQf/Dw5qy32KhYYMtkh?= =?us-ascii?Q?YQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?2XKGMr0Qc5uLhtklV4v+VOf9yXNG+aQsMGcPIHBUvnH5Q1XzafO1dx63wUL4?= =?us-ascii?Q?g44ozUGD32B2uECqqO3Bp80zB29QBAw6DMCsmpO3mUZuTqxFJKXW5e+yWiVN?= =?us-ascii?Q?3jHlEjOwPc5VMUwSBvdR8H5edyEdBXi5t7LsV6QR/02djlgpQV+EVSmY13DM?= =?us-ascii?Q?IOgcD+6ju7KNs66FjmdCF5YcxmdEJfHGXajisdveJ1qzBGhi7WsYfQaV/8CP?= =?us-ascii?Q?wPAhL2LrUUE/8Z8aODnDw3Ve9FkQt82Sp8oItmsUBiYzzhKTEzheDS3tKEOO?= =?us-ascii?Q?c+87DqC2NSIhi9SeWZ7kNV9NJjRVFkb+P/gX7ORZlotsjHdAO9WuuvCjm51A?= =?us-ascii?Q?Ho5UXNLoumEzt1BBaa/VXqxFhs6P1BgFHHHcyqUFVPOuGYfxFPlHBBS5RtBL?= =?us-ascii?Q?hHubMxCbnNFQtuWcFEgsvxGh0nN+PaWXhW4bu7QuojqlcXl2dIWtuefWQpf7?= =?us-ascii?Q?9ngM0x2cEXccGYqmgWTx9RiMq8Y7stt6L2c5aVCFgTy1VvMqTR4lOA0vqQ2E?= =?us-ascii?Q?wA6CnoEGsa9Zpfo1qP3/mggN9UVKPaJKsiHGINnfWaCDj+0P3OozzQYs1JTY?= =?us-ascii?Q?7nRPpxeWGlqnzm8HsZC09QPtegSel2W6mvO0qutiZyf/zfrlCB7+A0LTO/Ki?= =?us-ascii?Q?ab+3e2JhsOf5m3CM4poA5qog8zUGNUaLir4TM8VEpF47TOZFHYzuITymAvjq?= =?us-ascii?Q?KYVvSRyRPMuRsftt64PmlA0lw8qAw0BRubKlXuMoud+IgigZBQ21Pu99ukqB?= =?us-ascii?Q?KinKSx9YZ2UNLa+gafeK7OGAkbxixU+oVR7Bn2HjDZyRV6ssZ/25RqIqzvql?= =?us-ascii?Q?bapEAfjH+VWLbGPiyehGHU/HzDz0YiEgutjw7kHDkeZowJNIN83lh7VpsRjA?= =?us-ascii?Q?NyZb358TXB0wQjQqH8XdSy0AiGm/8KNe7qcO+SGPZdIW28JNbnb/lfYr8MMy?= =?us-ascii?Q?GNGmfcYNLAufNzsu0xRhRyFOMbHBVl4NDoGhbwECDvJmb8NvEgNvBP2mtMF8?= =?us-ascii?Q?RsXe3XsjDq9oyQvJR+M2ueBeOEsqBvmDM3GnxhtLOq/kLUwf/EvKy0BfzMzP?= =?us-ascii?Q?DDDKgrDImoLNqooOeBJ+gLgcHflZWvowmMkZO3jeS7y5LQk7lhQfOc/5RV/1?= =?us-ascii?Q?DjXAutoM5AH31hktlu9mwZLpZe1E+3z+fnnfz0y0NNxCyGD1ph5U3LO6vX0o?= =?us-ascii?Q?ZTkq08UOcLMMmtuxJr3Eg46nQl0D4PIiwWj7GXqhhhjGDOJvgVzsEmz42YDc?= =?us-ascii?Q?svYJtFZ3LtgSOmUqEd96l781qVMIYgXfcQL7p2J1OM7huaRFIOR6hfzIFbna?= =?us-ascii?Q?6MSoN4wZ38PkpbSu+3TRPBi/zUKCcCy6k4DEwcvOEc/n3zufRJJFrbjryp9O?= =?us-ascii?Q?1pp2mKqoZ8KnLmKyZpmly6EqOm5xFPRrBQvkgjhK4O2xkWS4g0lSdx2N2lf2?= =?us-ascii?Q?EPEZW8+hQZkM13VVorR+VYZwiBCVOjzA205XBuMgZExNF6IJvIcjqhFmK87l?= =?us-ascii?Q?QXplCmHclc1lV0DW3mPN504crYrVPZHPZJRQWY+i1ykSscGy/qkiBqnd4Bl/?= =?us-ascii?Q?xQYOVaoItgDc4iwrmVsN9CvwQTSfNEyxKA3uqE/37H0sp0HmHL7/58IhY/Op?= =?us-ascii?Q?Krpe/EJVM5wuzcO+ZDAo0mVn8bMzdksV3kJDnsgHlVb7hsk+7IxYp/olMm5w?= =?us-ascii?Q?8MJ7XWuL/yZx2wGIe3OQ/Zeg8sghM1T/QZM0lC6BXtHe/Sa4bcS97DEdzDvx?= =?us-ascii?Q?WYCTMhIpXj8Xxfd2KGRNAwni4pI1daGUp5iTy0AEjQEyWkp4asgw?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: c01f8d4b-7e78-4607-335f-08de569931f2 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:10.1602 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: BpHqTuaAcRuwW33HxeQHq4YGPG4wnwDNXEP4zj90/MSyWIxGt+Boy2Pbk/Bu4gwCflpaV9wtbSP8OMXhedDLbA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" The transport code is being refactored to support multiple clients and transport backends. As a first step, split the module into a core library and a thin default client that binds to NTB ports. Move module parameters and the legacy ntb_client glue into a new ntb_transport.c. Export ntb_transport_attach()/ntb_transport_detach() from the core so other clients can reuse the common transport infrastructure. No functional change intended for the default transport. Signed-off-by: Koichiro Den --- drivers/ntb/Makefile | 3 +- drivers/ntb/ntb_transport.c | 81 ++++++++++++++++++++++++ drivers/ntb/ntb_transport_core.c | 93 ++++++++++------------------ drivers/ntb/ntb_transport_internal.h | 15 +++++ 4 files changed, 128 insertions(+), 64 deletions(-) create mode 100644 drivers/ntb/ntb_transport.c diff --git a/drivers/ntb/Makefile b/drivers/ntb/Makefile index 9b66e5fafbc0..47e6b95ef7ce 100644 --- a/drivers/ntb/Makefile +++ b/drivers/ntb/Makefile @@ -1,8 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_NTB) +=3D ntb.o hw/ test/ obj-$(CONFIG_NTB_TRANSPORT) +=3D ntb_transport.o +obj-$(CONFIG_NTB_TRANSPORT) +=3D ntb_transport_core.o =20 ntb-y :=3D core.o ntb-$(CONFIG_NTB_MSI) +=3D msi.o - -ntb_transport-y :=3D ntb_transport_core.o diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c new file mode 100644 index 000000000000..dafb97e38883 --- /dev/null +++ b/drivers/ntb/ntb_transport.c @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) +/* + * Copyright(c) 2012 Intel Corporation. All rights reserved. + * Copyright (C) 2015 EMC Corporation. All Rights Reserved. + * + * Default NTB transport client module. + * + * The transport core library and backend infrastructure are implemented in + * ntb_transport_core.c. This module provides the default client that binds + * to NTB ports and instantiates the default transport for consumers such + * as ntb_netdev. + */ + +#include +#include + +#include "ntb_transport_internal.h" + +static unsigned long max_mw_size; +module_param(max_mw_size, ulong, 0644); +MODULE_PARM_DESC(max_mw_size, "Limit size of large memory windows"); + +static unsigned int transport_mtu =3D 0x10000; +module_param(transport_mtu, uint, 0644); +MODULE_PARM_DESC(transport_mtu, "Maximum size of NTB transport packets"); + +static unsigned char max_num_clients; +module_param(max_num_clients, byte, 0644); +MODULE_PARM_DESC(max_num_clients, "Maximum number of NTB transport clients= "); + +static unsigned int copy_bytes =3D 1024; +module_param(copy_bytes, uint, 0644); +MODULE_PARM_DESC(copy_bytes, "Threshold under which NTB will use the CPU t= o copy instead of DMA"); + +static bool use_dma; +module_param(use_dma, bool, 0644); +MODULE_PARM_DESC(use_dma, "Use DMA engine to perform large data copy"); + +static bool use_msi; +#ifdef CONFIG_NTB_MSI +module_param(use_msi, bool, 0644); +MODULE_PARM_DESC(use_msi, "Use MSI interrupts instead of doorbells"); +#endif + +#define NTB_QP_DEF_NUM_ENTRIES 100 + +static int ntb_transport_host_probe(struct ntb_client *self, + struct ntb_dev *ndev) +{ + return ntb_transport_attach(ndev, "default", use_msi, max_mw_size, + transport_mtu, max_num_clients, copy_bytes, + use_dma, NTB_QP_DEF_NUM_ENTRIES); +} + +static void ntb_transport_host_remove(struct ntb_client *self, struct ntb_= dev *ndev) +{ + ntb_transport_detach(ndev); +} + +static struct ntb_client ntb_transport_host_client =3D { + .ops =3D { + .probe =3D ntb_transport_host_probe, + .remove =3D ntb_transport_host_remove, + }, +}; + +static int __init ntb_transport_host_init(void) +{ + return ntb_register_client(&ntb_transport_host_client); +} +module_init(ntb_transport_host_init); + +static void __exit ntb_transport_host_exit(void) +{ + ntb_unregister_client(&ntb_transport_host_client); +} +module_exit(ntb_transport_host_exit); + +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_AUTHOR("Intel Corporation"); +MODULE_DESCRIPTION("Software Queue-Pair Transport over NTB"); diff --git a/drivers/ntb/ntb_transport_core.c b/drivers/ntb/ntb_transport_c= ore.c index 04a13fdce71c..86181fe1eadd 100644 --- a/drivers/ntb/ntb_transport_core.c +++ b/drivers/ntb/ntb_transport_core.c @@ -69,7 +69,7 @@ #define NTB_TRANSPORT_VERSION 4 #define NTB_TRANSPORT_VER "4" #define NTB_TRANSPORT_NAME "ntb_transport" -#define NTB_TRANSPORT_DESC "Software Queue-Pair Transport over NTB" +#define NTB_TRANSPORT_DESC "NTB transport core library" #define NTB_TRANSPORT_MIN_SPADS (MW0_SZ_HIGH + 2) =20 MODULE_DESCRIPTION(NTB_TRANSPORT_DESC); @@ -77,31 +77,6 @@ MODULE_VERSION(NTB_TRANSPORT_VER); MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Intel Corporation"); =20 -static unsigned long max_mw_size; -module_param(max_mw_size, ulong, 0644); -MODULE_PARM_DESC(max_mw_size, "Limit size of large memory windows"); - -static unsigned int transport_mtu =3D 0x10000; -module_param(transport_mtu, uint, 0644); -MODULE_PARM_DESC(transport_mtu, "Maximum size of NTB transport packets"); - -static unsigned char max_num_clients; -module_param(max_num_clients, byte, 0644); -MODULE_PARM_DESC(max_num_clients, "Maximum number of NTB transport clients= "); - -static unsigned int copy_bytes =3D 1024; -module_param(copy_bytes, uint, 0644); -MODULE_PARM_DESC(copy_bytes, "Threshold under which NTB will use the CPU t= o copy instead of DMA"); - -static bool use_dma; -module_param(use_dma, bool, 0644); -MODULE_PARM_DESC(use_dma, "Use DMA engine to perform large data copy"); - -static bool use_msi; -#ifdef CONFIG_NTB_MSI -module_param(use_msi, bool, 0644); -MODULE_PARM_DESC(use_msi, "Use MSI interrupts instead of doorbells"); -#endif =20 static struct dentry *nt_debugfs_dir; =20 @@ -135,12 +110,10 @@ enum { #define drv_client(__drv) \ container_of((__drv), struct ntb_transport_client, driver) =20 -#define NTB_QP_DEF_NUM_ENTRIES 100 #define NTB_LINK_DOWN_TIMEOUT 10 =20 static void ntb_transport_rxc_db(unsigned long data); static const struct ntb_ctx_ops ntb_transport_ops; -static struct ntb_client ntb_transport_client; static int ntb_async_tx_submit(struct ntb_transport_qp *qp, struct ntb_queue_entry *entry); static void ntb_memcpy_tx(struct ntb_queue_entry *entry, void __iomem *off= set); @@ -456,8 +429,8 @@ static int ntb_transport_setup_qp_mw(struct ntb_transpo= rt_ctx *nt, =20 if (mw_size > mw->xlat_size) mw_size =3D mw->xlat_size; - if (max_mw_size && mw_size > max_mw_size) - mw_size =3D max_mw_size; + if (nt->max_mw_size && mw_size > nt->max_mw_size) + mw_size =3D nt->max_mw_size; =20 tx_size =3D (unsigned int)mw_size / num_qps_mw; qp_offset =3D tx_size * (qp_num / mw_count); @@ -481,9 +454,9 @@ static int ntb_transport_setup_qp_mw(struct ntb_transpo= rt_ctx *nt, qp->rx_info =3D qp->tx_mw + tx_size; =20 /* Due to housekeeping, there must be atleast 2 buffs */ - qp->tx_max_frame =3D min(transport_mtu, tx_size / 2); + qp->tx_max_frame =3D min(nt->transport_mtu, tx_size / 2); qp->tx_max_entry =3D tx_size / qp->tx_max_frame; - qp->rx_max_frame =3D min(transport_mtu, rx_size / 2); + qp->rx_max_frame =3D min(nt->transport_mtu, rx_size / 2); qp->rx_max_entry =3D rx_size / qp->rx_max_frame; qp->rx_index =3D 0; =20 @@ -909,8 +882,8 @@ static void ntb_transport_link_work(struct work_struct = *work) for (i =3D 0; i < nt->mw_count; i++) { size =3D nt->mw_vec[i].phys_size; =20 - if (max_mw_size && size > max_mw_size) - size =3D max_mw_size; + if (nt->max_mw_size && size > nt->max_mw_size) + size =3D nt->max_mw_size; =20 spad =3D MW0_SZ_HIGH + (i * 2); ntb_peer_spad_write(ndev, PIDX, spad, upper_32_bits(size)); @@ -1084,7 +1057,12 @@ static int ntb_transport_init_queue(struct ntb_trans= port_ctx *nt, return 0; } =20 -static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *nd= ev) +int ntb_transport_attach(struct ntb_dev *ndev, const char *backend_name, + bool use_msi, unsigned long max_mw_size, + unsigned int transport_mtu, + unsigned char max_num_clients, + unsigned int copy_bytes, bool use_dma, + unsigned int num_rx_entries) { struct ntb_transport_ctx *nt; struct ntb_transport_mw *mw; @@ -1117,6 +1095,11 @@ static int ntb_transport_probe(struct ntb_client *se= lf, struct ntb_dev *ndev) return -ENOMEM; =20 nt->ndev =3D ndev; + nt->max_mw_size =3D max_mw_size; + nt->transport_mtu =3D transport_mtu; + nt->copy_bytes =3D copy_bytes; + nt->use_dma =3D use_dma; + nt->num_rx_entries =3D num_rx_entries; =20 /* * If we are using MSI, and have at least one extra memory window, @@ -1241,8 +1224,9 @@ static int ntb_transport_probe(struct ntb_client *sel= f, struct ntb_dev *ndev) kfree(nt); return rc; } +EXPORT_SYMBOL_GPL(ntb_transport_attach); =20 -static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *nd= ev) +void ntb_transport_detach(struct ntb_dev *ndev) { struct ntb_transport_ctx *nt =3D ndev->ctx; struct ntb_transport_qp *qp; @@ -1262,6 +1246,7 @@ static void ntb_transport_free(struct ntb_client *sel= f, struct ntb_dev *ndev) ntb_transport_free_queue(qp); debugfs_remove_recursive(qp->debugfs_dir); } + debugfs_remove(nt->debugfs_node_dir); =20 ntb_link_disable(ndev); ntb_clear_ctx(ndev); @@ -1277,6 +1262,7 @@ static void ntb_transport_free(struct ntb_client *sel= f, struct ntb_dev *ndev) kfree(nt->mw_vec); kfree(nt); } +EXPORT_SYMBOL_GPL(ntb_transport_detach); =20 static void ntb_complete_rxc(struct ntb_transport_qp *qp) { @@ -1438,7 +1424,7 @@ static void ntb_async_rx(struct ntb_queue_entry *entr= y, void *offset) if (!chan) goto err; =20 - if (entry->len < copy_bytes) + if (entry->len < qp->transport->copy_bytes) goto err; =20 res =3D ntb_async_rx_submit(entry, offset); @@ -1718,7 +1704,7 @@ static void ntb_async_tx(struct ntb_transport_qp *qp, if (!chan) goto err; =20 - if (entry->len < copy_bytes) + if (entry->len < qp->transport->copy_bytes) goto err; =20 res =3D ntb_async_tx_submit(qp, entry); @@ -1856,7 +1842,7 @@ ntb_transport_create_queue(void *data, struct device = *client_dev, dma_cap_zero(dma_mask); dma_cap_set(DMA_MEMCPY, dma_mask); =20 - if (use_dma) { + if (nt->use_dma) { qp->tx_dma_chan =3D dma_request_channel(dma_mask, ntb_dma_filter_fn, (void *)(unsigned long)node); @@ -1892,7 +1878,7 @@ ntb_transport_create_queue(void *data, struct device = *client_dev, dev_dbg(&pdev->dev, "Using %s memcpy for RX\n", qp->rx_dma_chan ? "DMA" : "CPU"); =20 - for (i =3D 0; i < NTB_QP_DEF_NUM_ENTRIES; i++) { + for (i =3D 0; i < nt->num_rx_entries; i++) { entry =3D kzalloc_node(sizeof(*entry), GFP_KERNEL, node); if (!entry) goto err1; @@ -1901,7 +1887,7 @@ ntb_transport_create_queue(void *data, struct device = *client_dev, ntb_list_add(&qp->ntb_rx_q_lock, &entry->entry, &qp->rx_free_q); } - qp->rx_alloc_entry =3D NTB_QP_DEF_NUM_ENTRIES; + qp->rx_alloc_entry =3D nt->num_rx_entries; =20 for (i =3D 0; i < qp->tx_max_entry; i++) { entry =3D kzalloc_node(sizeof(*entry), GFP_KERNEL, node); @@ -2301,13 +2287,6 @@ static const struct ntb_ctx_ops ntb_transport_ops = =3D { .db_event =3D ntb_transport_doorbell_callback, }; =20 -static struct ntb_client ntb_transport_client =3D { - .ops =3D { - .probe =3D ntb_transport_probe, - .remove =3D ntb_transport_free, - }, -}; - static int __init ntb_transport_init(void) { int rc; @@ -2318,26 +2297,16 @@ static int __init ntb_transport_init(void) nt_debugfs_dir =3D debugfs_create_dir(KBUILD_MODNAME, NULL); =20 rc =3D bus_register(&ntb_transport_bus); - if (rc) - goto err_bus; - - rc =3D ntb_register_client(&ntb_transport_client); - if (rc) - goto err_client; - - return 0; - -err_client: - bus_unregister(&ntb_transport_bus); -err_bus: - debugfs_remove_recursive(nt_debugfs_dir); + if (rc) { + bus_unregister(&ntb_transport_bus); + debugfs_remove_recursive(nt_debugfs_dir); + } return rc; } module_init(ntb_transport_init); =20 static void __exit ntb_transport_exit(void) { - ntb_unregister_client(&ntb_transport_client); bus_unregister(&ntb_transport_bus); debugfs_remove_recursive(nt_debugfs_dir); } diff --git a/drivers/ntb/ntb_transport_internal.h b/drivers/ntb/ntb_transpo= rt_internal.h index 6b45790cc88e..406033dbddb7 100644 --- a/drivers/ntb/ntb_transport_internal.h +++ b/drivers/ntb/ntb_transport_internal.h @@ -134,9 +134,17 @@ struct ntb_transport_ctx { struct ntb_transport_qp *qp_vec; unsigned int mw_count; unsigned int qp_count; + unsigned int max_qp_count; u64 qp_bitmap; u64 qp_bitmap_free; =20 + /* Parameters */ + unsigned int num_rx_entries; + unsigned int transport_mtu; + unsigned long max_mw_size; + unsigned int copy_bytes; + bool use_dma; + bool use_msi; unsigned int msi_spad_offset; u64 msi_db_mask; @@ -162,5 +170,12 @@ struct ntb_queue_entry *ntb_list_rm(spinlock_t *lock, = struct list_head *list); struct ntb_queue_entry *ntb_list_mv(spinlock_t *lock, struct list_head *li= st, struct list_head *to_list); void ntb_qp_link_down(struct ntb_transport_qp *qp); +int ntb_transport_attach(struct ntb_dev *ndev, const char *backend_name, + bool use_msi, unsigned long max_mw_size, + unsigned int transport_mtu, + unsigned char max_num_clients, + unsigned int copy_bytes, bool use_dma, + unsigned int num_rx_entries); +void ntb_transport_detach(struct ntb_dev *ndev); =20 #endif /* _NTB_TRANSPORT_INTERNAL_H_ */ --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021122.outbound.protection.outlook.com [40.107.74.122]) (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 33AC933B96B; Sun, 18 Jan 2026 13:55:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744540; cv=fail; b=h5yrP56xZD0zB2+77pc4kUh701/SseGtaK1QmmBeNQ1K1EYcd+qLYzggtRIZ58+aR9RnP+ZcWOSjhKBugeFsxUCeeDBcRpOzwTa7CnP8ZRQY2jvqeVeR1NHDZ5yaNZYTwWBfMpgLO1Y6JrLNIzNRz7DJPJNKRH6IXmbMUfCzZNU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744540; c=relaxed/simple; bh=AUZc9Sd0+8wnsa7emkOaSfwbFeUEWLv98Qsw7SfrK9Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=mC8GAD5mgGksVCJs08fwDcCsgD8BtmcE4gZRLAGLx7smOqK6sDLbzOxt1JKT60eVFPbfPxZ/3xF/fr2Tett96umIcPhj62XZwc8qPqmPbQO5NOPwvMQWZEpz/OrXO5mRMbBaJpaqc9KT+NGEQVTtoB3pQ8U3iYA4ijyYerc4Q2A= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=vY/A+yd4; arc=fail smtp.client-ip=40.107.74.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="vY/A+yd4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=V7kh0l8nKJNHoxqkS8X7QmBO2N1JtKpQeHHkz2K1mIETqA2LtYs383xsviCZH7CJ2Rsg0lZTfX9uIzZSX/eaA6iuMAZPXvn+59XPedveTOoSyMW/iYck1smiKXe6K9RoBp28eUbvLjLxmi8d3Y6mZ43wZL5b9kZFc1SAK+0KnLQRzhmiUsKwewRPO0rJGYu//u3wYlybccrZrm2rdO8x/SZhs909judhTOwTCMbocG0EMRYJ9Oaantc5BF509eVrS8crrculHDNZyA068KK20yBrBaweSoIV2ZSu6k6ChwDKbHGMWkZCbibIhn27NNWYwdoOxyxPxaBSDUDdUyihMg== 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=Oi9kidn5SjYMzrrAWVSGO/PH7HtQ/UHb0liWW53Af3U=; b=tp+MDfuGWHIFQPaGPr7NW9mmnmaIi0VUi/9OSlIu8Fou4xgVht5HvKuLYyBCI3NOgZD6lhu1la5CzMyp3Hayyg3McLCgiJcmub2HDHlQzYJIn7I6XeTNGDh5feudUZAaFqKaGVGkngzYvsf2Wc+xu4kaOYT7so13b2qewDaREX8LT4FIE7Mjv6yRbzWiTZAiJLxem+l9wz5rtsTV8R1Uq5zf3xPiS3wiNIDjfbho5tQMfrU6k2RXMt0lW7LPUU9iUELsSC5aPydoyP3NFjGcSlZ0Mj+zr1D2PBpfb/cmK4S8EfS+dX0EC4qrAekMB/WLchh9C7RRRz0H+m7JSBHTFw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Oi9kidn5SjYMzrrAWVSGO/PH7HtQ/UHb0liWW53Af3U=; b=vY/A+yd4thoQsQZrFjQKg8FC9CPKvFWi6svSlREJ8iaEDnokwQLu7CmZmDq0rYh+/qRWLqLBtSKMZw1TwFmEu7RKILliUtKc+ZJz+OTyTrvYR9Sx3dEsCPOyEMI2PbtEO9uOD5pQQlb8+uihPiWnFEKIQ6SqY8PL5Pl/uazcgpQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:11 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:11 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 23/38] NTB: ntb_transport: Add transport backend infrastructure Date: Sun, 18 Jan 2026 22:54:25 +0900 Message-ID: <20260118135440.1958279-24-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0101.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:380::8) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: f8bb0ff4-bc72-4c46-0877-08de569932b0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?e4tUSC5ee4Vc3mDuiqH+xpMQ4audLGpBJQB0jOlJayYdGhQ1XpuXl8RHXwSy?= =?us-ascii?Q?uE4ct//AjHTTIQTEbZjdp+wip383uDabdd92jixTqOXgtEi8U4v9o80V9iss?= =?us-ascii?Q?gYel6hBacH4QGznHmhEZQgCJI/100IR7Cbs/xF99b+QJJWRozqlLj5IrmALq?= =?us-ascii?Q?yjGRhUTJEKjkxJGinv0yNavO1BWZS6xW0cTtWb0Cp6cuJewIL1e5UFqtrBQo?= =?us-ascii?Q?IRE2cHVF93zJfrW+K4bjBPiPePYrpG+grKQK16GWZy+076suo8M65aEgrZXQ?= =?us-ascii?Q?8SDK6RH+6DxnTktxaCLq4SQECBShFsrLK9sxZ6VrmXJtISrHjF0RP/QGZHaO?= =?us-ascii?Q?7VLkeb3w6AneVYSbZ+n46+kd9scIT63XST31tUh98TASOD8jRuGJ9vpfIEkX?= =?us-ascii?Q?/55cviMSXJI0xbOAuOgk6AlfgY1CC0SO192mVDGcE5iSPdLaphjuikrNVoI2?= =?us-ascii?Q?OZzZ29bUUtrsEnvRPj9aa5bFWI4cuNyxloLZsBcP4pnRdBndh4xfo3c0weno?= =?us-ascii?Q?CKC5uMvXBQohivlhCWPju4tC8EPhu/eYxLOo2pxAGi1jVDSySpy/K5qujZzh?= =?us-ascii?Q?TyJGc1r7y1Hlp7UtQLY76sCmQzHWUw5rdN5KBdHAlHvUSJbiJER8CnRyuYt3?= =?us-ascii?Q?rQ6GjM7R26iv7FRfEGiux+Eqwubjhpm4SX2UfMnyzTwEsYCGlwFSWaSzMgbJ?= =?us-ascii?Q?ARgPdSOQ+5IwBYlvfkVrmR4wxYc69pgdBTbY7ZotAVoPNI3iwBK3R3AFFDrq?= =?us-ascii?Q?pz5QHOsrmjUmEXCJ4w/ubOTO6pNFqyCL+eMz1Xs/ffS55C+3rvIt4vPn13v/?= =?us-ascii?Q?kCKZLshgP4rnwqhLbx26uvdyVzFPt9OXJSTDKgAVbMmBoD9HmCRiQY22LzOV?= =?us-ascii?Q?V6xd1hUvnKY+PK6eqx/u0mlovg0TZpz84l9iTSzx03a8feDA4Ei5bTi9Ue9s?= =?us-ascii?Q?ACkUi3AAZL4RaovpSnsZRo5oi8dlYjok2OduFWTMXavPK2h9ciTHw4TMQwBY?= =?us-ascii?Q?KRt0cZSyo1tMN65IjophwBH1TGfOqdD731L4p2SAHkbbhjGaTBhQnWUOAabW?= =?us-ascii?Q?F23slqq/6XlAov7m9C9WDixTnaTq+9T/491UUXf5C5aF3I2r6SQk1nAwQGAu?= =?us-ascii?Q?lLg4NvonbZb3Jq+4gKmufwzQb4FpFpqOPBeF1WnyUBbrUWUsFCiuqnnAFW3Z?= =?us-ascii?Q?Vz93rI1V1Oczk4RJlFCzMJSnVWGAISY6FBhicOL9wEzGklRiCetW2fUFPYRr?= =?us-ascii?Q?awW5aTeuQqZy8ttNlZMN5uM2oHuhVTtJ8buFCXnwCWdaSjEU9uuLW4yzT7/Q?= =?us-ascii?Q?EhLAchBzhKv2ndS2qeJAJSANrxQBif54w9m1RBJq/M2yKWmpLaAn4NO4CGQi?= =?us-ascii?Q?AyJmiuQiM4xb4HrHJ9Df+5wPuLU7bCDFyh9Uf169QADZ3JmmffgMP0F035B3?= =?us-ascii?Q?1T5JMXdgxH5tRTJDSUMvgQPhQxERSwmlSMHP4tOlT8TZMa5OENkBHsto0kmz?= =?us-ascii?Q?tKHW8kebDlAFZXYDkENbCevNTwt29vcsg1FeLeyoqadzSdU8JRwhIwuD5vtz?= =?us-ascii?Q?z6A4Bd3hvptq8+BlZmB9uBUQPhy+RLbDdTsgP3WTPnEFt7iB7EgjX0RU8VKH?= =?us-ascii?Q?aw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ZvEqanYOqRS4t5H2GYyJYF4u0GwnbkDjqN9nzfP5cRmuDxS0tJOQ+4aQIFlh?= =?us-ascii?Q?MYTOkvL3WJTLkbYct9mdfkK7f8TEYfrdN6U+RQ58IU3KxzSWYXxv8mRbytwp?= =?us-ascii?Q?cq1zmdRB8elKwDPym4YrBEL5zp6A9lpcV+nzcWlTHw1yy6UCZaebF4Q25Ncn?= =?us-ascii?Q?km1PmRo2DSy3DyRDx8k6aZI2qf2g2SBHF+Gx/VaBfXkI5u0wxcf+uKJLKUAZ?= =?us-ascii?Q?U8BNl+25sg8RW2rHKChZP1VhDp5+YUI8AUwQHUEE7sXPJnRWyZqBAku2Ke6E?= =?us-ascii?Q?ztZNRLDzBmBkL28C8MAANKFrVY1f3r/6RF4JD27TFeHTXvQ5APsYFNzaWcf+?= =?us-ascii?Q?fGGReg2ymjk4DzVElsAPLatktWdlxZmRx/kje7VVaBzEmTrap/HYLWzHDUMa?= =?us-ascii?Q?qjcW4NyK6x5kHGdtj2eztmL+FFCOR7YBD++LKOBl+VZ1w1ntreEvZVIVITzh?= =?us-ascii?Q?E33/CPMYhBIUoTqWp9Lv2vvDNBffOEaKwqpNn5mTKsZ5TnL+XLlf1ad4weJI?= =?us-ascii?Q?i+ZWox0RR/XCVEpIW1sOR/IQHOcIg7+xl4o/K6ffPUs6zTHMI8K12P3LQx0Z?= =?us-ascii?Q?kagfkDDWtxLHYRaKcakakYZC4umzRCc6ax2WlZflLZKXwm1+uGYs2MG431+0?= =?us-ascii?Q?g0z800h228waQxQ0SC/SfTdyl2dtJLg4ILG0Jpp/fE3XzhznowKHrwbnz/BB?= =?us-ascii?Q?AmNDGreufI2FKx41dS7QZ+IGhljAgmOJ6lclxsHTJ2lr38Ce3E95cm3J3PwA?= =?us-ascii?Q?Or8UbkV9YmhIv22LlBHotAUrkauAkt8qQe5lP5zVkEKRVMhzf7EdZhHlFNda?= =?us-ascii?Q?RH8EnJECa21Nf2rQSJ3cKSmsH/DqDzT2J8Vu5eGeg+mqk53LCcIa7t7KHqXV?= =?us-ascii?Q?CQf/nhvAYElf7L1mDvJDs1EyZInb6xPOmBKzx4JcEps6G/8twPs9XWZesn8Z?= =?us-ascii?Q?ON6lJ3IPddMeDqTSYVdAd5lSULIWzfX3ZE1ZmOt4PwJL+rd21ei6ZmrnZiin?= =?us-ascii?Q?OTnSgicERorlGRvxTuWtpc/zbkhfKMIC8QcZvOUX54/x2mJyrWiaVfpDp7nN?= =?us-ascii?Q?QvNeCjNOm6hVKE6EyW1QgrlKA33Pj4jW5GADsvuoHhCVRRzy2atZGn4dNHtc?= =?us-ascii?Q?GK4bZf7OPlFlIHocBNI1lvUDaN+o/qzbK/YU0nwRRixRMcTz9k8niaqsjDVK?= =?us-ascii?Q?1DeoFc3agZr7xEgbYLpGqQ2HXWPoxgxqf28rsvAuvJU2knnigStf7QuNWhTO?= =?us-ascii?Q?RUxxMhs4zyKEn0wjRWA4v87EEesHDBYBnm8AE7nSpOWcBMP0c8u3qG2ijWbd?= =?us-ascii?Q?6s5MZSn1YY2pCP/JLA7tEIscDMoL9kaCMROlhjEzlqKnSS3wsBq0LJTAAn4x?= =?us-ascii?Q?xG5ihlYqWvsGzC5ggmNM1QAsJZhYvcFwH+GFDdo/bbIVI+0ycDkKjKCtrBN1?= =?us-ascii?Q?szvAatBwM+Gs3kEpuRxDHzfAUOnrsVUUTFHsozF98MBJZuPVm2iqdY0YpFis?= =?us-ascii?Q?YVMf4DZxtjtZnJ9iAzD+uqC9D3JRfkZumCR73L2KqctxmMSUcPV0OkKW+ZrR?= =?us-ascii?Q?VGCYVKPNzVr9YEYFwoSo7S59F2gQmnST0oste+YyWQ2z826XQbrmg4zwGXOK?= =?us-ascii?Q?u1QFlWiFqlifC9u7BPQzm5iOfMchYsknfD30otFrsZ07e8gym+Gn68bDNVnS?= =?us-ascii?Q?+L8oeVI7CyrxbcVdxbQLNS60o9XmvbxiorYdF4Fe9FkfzCsKsduavNL5DbtD?= =?us-ascii?Q?ms9+Uc9YSSrFIyviBmttqojxX9ippxsxrrS0L5hifopga0cq+KMK?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: f8bb0ff4-bc72-4c46-0877-08de569932b0 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:11.4241 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: t4qWQU256nR5B/r/l6H/q7a/yp9o01scpib5KD3KBf4KtZ3+xOEmqI9znD0/4wz4V3ildLfQEuQ2MwQUd2DDNQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Introduce a backend abstraction layer so ntb_transport can support multiple data-plane implementations without too much code duplication. Add backend registration APIs, store the selected backend in the transport context, and route key operations through backend hooks. Also add per-entry/per-QP private pointers and move backend-specific debugfs stats behind the backend ops callback. Register the existing implementation as the default backend. Signed-off-by: Koichiro Den --- drivers/ntb/ntb_transport_core.c | 329 ++++++++++++++++++++++----- drivers/ntb/ntb_transport_internal.h | 80 +++++++ 2 files changed, 347 insertions(+), 62 deletions(-) diff --git a/drivers/ntb/ntb_transport_core.c b/drivers/ntb/ntb_transport_c= ore.c index 86181fe1eadd..2129fa7a22d8 100644 --- a/drivers/ntb/ntb_transport_core.c +++ b/drivers/ntb/ntb_transport_core.c @@ -77,6 +77,8 @@ MODULE_VERSION(NTB_TRANSPORT_VER); MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Intel Corporation"); =20 +static LIST_HEAD(ntb_transport_backends); +static DEFINE_MUTEX(ntb_transport_backend_lock); =20 static struct dentry *nt_debugfs_dir; =20 @@ -300,15 +302,51 @@ void ntb_transport_unregister_client(struct ntb_trans= port_client *drv) } EXPORT_SYMBOL_GPL(ntb_transport_unregister_client); =20 -static int ntb_qp_debugfs_stats_show(struct seq_file *s, void *v) +int ntb_transport_backend_register(struct ntb_transport_backend *b) { - struct ntb_transport_qp *qp =3D s->private; + struct ntb_transport_backend *tmp; =20 - if (!qp || !qp->link_is_up) - return 0; + if (!b || !b->name || !b->ops) + return -EINVAL; =20 - seq_puts(s, "\nNTB QP stats:\n\n"); + mutex_lock(&ntb_transport_backend_lock); + list_for_each_entry(tmp, &ntb_transport_backends, node) { + if (!strcmp(tmp->name, b->name)) { + mutex_unlock(&ntb_transport_backend_lock); + return -EEXIST; + } + } + list_add_tail(&b->node, &ntb_transport_backends); + mutex_unlock(&ntb_transport_backend_lock); + return 0; +} +EXPORT_SYMBOL_GPL(ntb_transport_backend_register); + +void ntb_transport_backend_unregister(struct ntb_transport_backend *b) +{ + if (!b) + return; + mutex_lock(&ntb_transport_backend_lock); + list_del_init(&b->node); + mutex_unlock(&ntb_transport_backend_lock); +} +EXPORT_SYMBOL_GPL(ntb_transport_backend_unregister); + +static struct ntb_transport_backend *ntb_transport_backend_find(const char= *name) +{ + struct ntb_transport_backend *b; + + list_for_each_entry(b, &ntb_transport_backends, node) { + if (!strcmp(b->name, name)) + return b; + } + + return NULL; +} =20 +static void ntb_transport_default_debugfs_stats_show(struct seq_file *s, + struct ntb_transport_qp *qp) +{ seq_printf(s, "rx_bytes - \t%llu\n", qp->rx_bytes); seq_printf(s, "rx_pkts - \t%llu\n", qp->rx_pkts); seq_printf(s, "rx_memcpy - \t%llu\n", qp->rx_memcpy); @@ -338,6 +376,17 @@ static int ntb_qp_debugfs_stats_show(struct seq_file *= s, void *v) seq_printf(s, "Using TX DMA - \t%s\n", qp->tx_dma_chan ? "Yes" : "No"); seq_printf(s, "Using RX DMA - \t%s\n", qp->rx_dma_chan ? "Yes" : "No"); seq_printf(s, "QP Link - \t%s\n", qp->link_is_up ? "Up" : "Down"); +} + +static int ntb_qp_debugfs_stats_show(struct seq_file *s, void *v) +{ + struct ntb_transport_qp *qp =3D s->private; + + if (!qp || !qp->link_is_up) + return 0; + + seq_puts(s, "\nNTB QP stats:\n\n"); + qp->transport->backend->ops->debugfs_stats_show(s, qp); seq_putc(s, '\n'); =20 return 0; @@ -395,8 +444,37 @@ struct ntb_queue_entry *ntb_list_mv(spinlock_t *lock, = struct list_head *list, } EXPORT_SYMBOL_GPL(ntb_list_mv); =20 -static int ntb_transport_setup_qp_mw(struct ntb_transport_ctx *nt, - unsigned int qp_num) +struct ntb_queue_entry * +ntb_queue_entry_alloc(struct ntb_transport_ctx *nt, struct ntb_transport_q= p *qp, int node) +{ + static struct ntb_queue_entry *entry; + + entry =3D kzalloc_node(sizeof(*entry), GFP_KERNEL, node); + if (!entry) + return NULL; + + if (nt->backend->ops->entry_priv_alloc) { + entry->priv =3D nt->backend->ops->entry_priv_alloc(); + if (!entry->priv) { + kfree(entry); + return NULL; + } + } + return entry; +} +EXPORT_SYMBOL_GPL(ntb_queue_entry_alloc); + +static void +ntb_queue_entry_free(struct ntb_transport_ctx *nt, struct ntb_queue_entry = *entry) +{ + if (nt->backend->ops->entry_priv_free) + nt->backend->ops->entry_priv_free(entry->priv); + + kfree(entry); +} + +static int ntb_transport_default_setup_qp_mw(struct ntb_transport_ctx *nt, + unsigned int qp_num) { struct ntb_transport_qp *qp =3D &nt->qp_vec[qp_num]; struct ntb_transport_mw *mw; @@ -467,7 +545,7 @@ static int ntb_transport_setup_qp_mw(struct ntb_transpo= rt_ctx *nt, */ node =3D dev_to_node(&ndev->dev); for (i =3D qp->rx_alloc_entry; i < qp->rx_max_entry; i++) { - entry =3D kzalloc_node(sizeof(*entry), GFP_KERNEL, node); + entry =3D ntb_queue_entry_alloc(nt, qp, node); if (!entry) return -ENOMEM; =20 @@ -805,6 +883,9 @@ static void ntb_transport_link_cleanup(struct ntb_trans= port_ctx *nt) u64 qp_bitmap_alloc; unsigned int i, count; =20 + if (nt->backend->ops->link_down) + nt->backend->ops->link_down(nt); + qp_bitmap_alloc =3D nt->qp_bitmap & ~nt->qp_bitmap_free; =20 /* Pass along the info to any clients */ @@ -866,6 +947,12 @@ static void ntb_transport_link_work(struct work_struct= *work) =20 /* send the local info, in the opposite order of the way we read it */ =20 + if (nt->backend->ops->link_up_pre) { + rc =3D nt->backend->ops->link_up_pre(nt); + if (rc) + return; + } + if (nt->use_msi) { rc =3D ntb_msi_setup_mws(ndev); if (rc) { @@ -952,10 +1039,16 @@ static void ntb_transport_link_work(struct work_stru= ct *work) =20 nt->link_is_up =3D true; =20 + if (nt->backend->ops->link_up_post) { + rc =3D nt->backend->ops->link_up_post(nt); + if (rc) + return; + } + for (i =3D 0; i < nt->qp_count; i++) { struct ntb_transport_qp *qp =3D &nt->qp_vec[i]; =20 - ntb_transport_setup_qp_mw(nt, i); + nt->backend->ops->setup_qp_mw(nt, i); ntb_transport_setup_qp_peer_msi(nt, i); =20 if (qp->client_ready) @@ -1012,8 +1105,7 @@ static void ntb_qp_link_work(struct work_struct *work) msecs_to_jiffies(NTB_LINK_DOWN_TIMEOUT)); } =20 -static int ntb_transport_init_queue(struct ntb_transport_ctx *nt, - unsigned int qp_num) +int ntb_transport_init_queue(struct ntb_transport_ctx *nt, unsigned int qp= _num) { struct ntb_transport_qp *qp; =20 @@ -1057,6 +1149,69 @@ static int ntb_transport_init_queue(struct ntb_trans= port_ctx *nt, return 0; } =20 +static unsigned int ntb_transport_default_tx_free_entry(struct ntb_transpo= rt_qp *qp) +{ + unsigned int head =3D qp->tx_index; + unsigned int tail =3D qp->remote_rx_info->entry; + + return tail >=3D head ? tail - head : qp->tx_max_entry + tail - head; +} + +static int ntb_transport_default_rx_enqueue(struct ntb_transport_qp *qp, + struct ntb_queue_entry *entry) +{ + ntb_list_add(&qp->ntb_rx_q_lock, &entry->entry, &qp->rx_pend_q); + + if (qp->active) + tasklet_schedule(&qp->rxc_db_work); + + return 0; +} + +static void ntb_transport_default_rx_poll(struct ntb_transport_qp *qp); +static int ntb_transport_default_tx_enqueue(struct ntb_transport_qp *qp, + struct ntb_queue_entry *entry, + void *cb, void *data, unsigned int len, + unsigned int flags); + +static const struct ntb_transport_backend_ops default_backend_ops =3D { + .setup_qp_mw =3D ntb_transport_default_setup_qp_mw, + .tx_free_entry =3D ntb_transport_default_tx_free_entry, + .tx_enqueue =3D ntb_transport_default_tx_enqueue, + .rx_enqueue =3D ntb_transport_default_rx_enqueue, + .rx_poll =3D ntb_transport_default_rx_poll, + .debugfs_stats_show =3D ntb_transport_default_debugfs_stats_show, +}; + +static struct ntb_transport_backend default_transport_backend =3D { + .name =3D "default", + .ops =3D &default_backend_ops, + .owner =3D THIS_MODULE, +}; + +static struct ntb_transport_backend * +ntb_transport_backend_get(const char *name) +{ + struct ntb_transport_backend *b; + + if (!name || !name[0]) + name =3D "default"; + + mutex_lock(&ntb_transport_backend_lock); + b =3D ntb_transport_backend_find(name); + if (b && !try_module_get(b->owner)) + b =3D NULL; + mutex_unlock(&ntb_transport_backend_lock); + + return b; +} + +static void +ntb_transport_backend_put(struct ntb_transport_backend *b) +{ + module_put(b->owner); +} + int ntb_transport_attach(struct ntb_dev *ndev, const char *backend_name, bool use_msi, unsigned long max_mw_size, unsigned int transport_mtu, @@ -1064,6 +1219,7 @@ int ntb_transport_attach(struct ntb_dev *ndev, const = char *backend_name, unsigned int copy_bytes, bool use_dma, unsigned int num_rx_entries) { + struct ntb_transport_backend *b; struct ntb_transport_ctx *nt; struct ntb_transport_mw *mw; unsigned int mw_count, qp_count, spad_count, max_mw_count_for_spads; @@ -1101,6 +1257,20 @@ int ntb_transport_attach(struct ntb_dev *ndev, const= char *backend_name, nt->use_dma =3D use_dma; nt->num_rx_entries =3D num_rx_entries; =20 + b =3D ntb_transport_backend_get(backend_name); + if (!b) { + rc =3D -EPROBE_DEFER; + goto err_free_ctx; + } + + nt->backend =3D b; + + if (b->ops->enable) { + rc =3D b->ops->enable(nt, &mw_count); + if (rc) + goto err_put_backend; + } + /* * If we are using MSI, and have at least one extra memory window, * we will reserve the last MW for the MSI window. @@ -1120,7 +1290,7 @@ int ntb_transport_attach(struct ntb_dev *ndev, const = char *backend_name, if (spad_count < NTB_TRANSPORT_MIN_SPADS) { nt->mw_count =3D 0; rc =3D -EINVAL; - goto err; + goto err_disable_backend; } =20 max_mw_count_for_spads =3D (spad_count - MW0_SZ_HIGH) / 2; @@ -1132,7 +1302,7 @@ int ntb_transport_attach(struct ntb_dev *ndev, const = char *backend_name, GFP_KERNEL, node); if (!nt->mw_vec) { rc =3D -ENOMEM; - goto err; + goto err_disable_backend; } =20 for (i =3D 0; i < mw_count; i++) { @@ -1141,12 +1311,12 @@ int ntb_transport_attach(struct ntb_dev *ndev, cons= t char *backend_name, rc =3D ntb_peer_mw_get_addr(ndev, i, &mw->phys_addr, &mw->phys_size); if (rc) - goto err1; + goto err_free_mw_vec; =20 mw->vbase =3D ioremap_wc(mw->phys_addr, mw->phys_size); if (!mw->vbase) { rc =3D -ENOMEM; - goto err1; + goto err_free_mw_vec; } =20 mw->buff_size =3D 0; @@ -1177,7 +1347,7 @@ int ntb_transport_attach(struct ntb_dev *ndev, const = char *backend_name, GFP_KERNEL, node); if (!nt->qp_vec) { rc =3D -ENOMEM; - goto err1; + goto err_free_mw_vec; } =20 if (nt_debugfs_dir) { @@ -1189,7 +1359,13 @@ int ntb_transport_attach(struct ntb_dev *ndev, const= char *backend_name, for (i =3D 0; i < qp_count; i++) { rc =3D ntb_transport_init_queue(nt, i); if (rc) - goto err2; + goto err_free_qp_vec; + + if (b->ops->qp_init) { + rc =3D b->ops->qp_init(nt, i); + if (rc) + goto err_free_qp_vec; + } } =20 INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work); @@ -1197,12 +1373,12 @@ int ntb_transport_attach(struct ntb_dev *ndev, cons= t char *backend_name, =20 rc =3D ntb_set_ctx(ndev, nt, &ntb_transport_ops); if (rc) - goto err2; + goto err_free_qp_vec; =20 INIT_LIST_HEAD(&nt->client_devs); rc =3D ntb_bus_init(nt); if (rc) - goto err3; + goto err_clear_ctx; =20 nt->link_is_up =3D false; ntb_link_enable(ndev, NTB_SPEED_AUTO, NTB_WIDTH_AUTO); @@ -1210,17 +1386,22 @@ int ntb_transport_attach(struct ntb_dev *ndev, cons= t char *backend_name, =20 return 0; =20 -err3: +err_clear_ctx: ntb_clear_ctx(ndev); -err2: +err_free_qp_vec: kfree(nt->qp_vec); -err1: +err_free_mw_vec: while (i--) { mw =3D &nt->mw_vec[i]; iounmap(mw->vbase); } kfree(nt->mw_vec); -err: +err_disable_backend: + if (b->ops->disable) + b->ops->disable(nt); +err_put_backend: + module_put(nt->backend->owner); +err_free_ctx: kfree(nt); return rc; } @@ -1229,10 +1410,13 @@ EXPORT_SYMBOL_GPL(ntb_transport_attach); void ntb_transport_detach(struct ntb_dev *ndev) { struct ntb_transport_ctx *nt =3D ndev->ctx; + struct ntb_transport_backend *b; struct ntb_transport_qp *qp; u64 qp_bitmap_alloc; int i; =20 + WARN_ON_ONCE(!nt); + ntb_transport_link_cleanup(nt); cancel_work_sync(&nt->link_cleanup); cancel_delayed_work_sync(&nt->link_work); @@ -1258,6 +1442,11 @@ void ntb_transport_detach(struct ntb_dev *ndev) iounmap(nt->mw_vec[i].vbase); } =20 + b =3D nt->backend; + if (b && b->ops->disable) + b->ops->disable(nt); + ntb_transport_backend_put(b); + kfree(nt->qp_vec); kfree(nt->mw_vec); kfree(nt); @@ -1513,14 +1702,10 @@ static int ntb_process_rxc(struct ntb_transport_qp = *qp) return 0; } =20 -static void ntb_transport_rxc_db(unsigned long data) +static void ntb_transport_default_rx_poll(struct ntb_transport_qp *qp) { - struct ntb_transport_qp *qp =3D (void *)data; int rc, i; =20 - dev_dbg(&qp->ndev->pdev->dev, "%s: doorbell %d received\n", - __func__, qp->qp_num); - /* Limit the number of packets processed in a single interrupt to * provide fairness to others */ @@ -1552,6 +1737,17 @@ static void ntb_transport_rxc_db(unsigned long data) } } =20 +static void ntb_transport_rxc_db(unsigned long data) +{ + struct ntb_transport_qp *qp =3D (void *)data; + struct ntb_transport_ctx *nt =3D qp->transport; + + dev_dbg(&qp->ndev->pdev->dev, "%s: doorbell %d received\n", + __func__, qp->qp_num); + + nt->backend->ops->rx_poll(qp); +} + static void ntb_tx_copy_callback(void *data, const struct dmaengine_result *res) { @@ -1721,9 +1917,18 @@ static void ntb_async_tx(struct ntb_transport_qp *qp, qp->tx_memcpy++; } =20 -static int ntb_process_tx(struct ntb_transport_qp *qp, - struct ntb_queue_entry *entry) +static int ntb_transport_default_tx_enqueue(struct ntb_transport_qp *qp, + struct ntb_queue_entry *entry, + void *cb, void *data, unsigned int len, + unsigned int flags) { + entry->cb_data =3D cb; + entry->buf =3D data; + entry->len =3D len; + entry->flags =3D flags; + entry->errors =3D 0; + entry->tx_index =3D 0; + if (!ntb_transport_tx_free_entry(qp)) { qp->tx_ring_full++; return -EAGAIN; @@ -1750,6 +1955,7 @@ static int ntb_process_tx(struct ntb_transport_qp *qp, =20 static void ntb_send_link_down(struct ntb_transport_qp *qp) { + struct ntb_transport_ctx *nt =3D qp->transport; struct pci_dev *pdev =3D qp->ndev->pdev; struct ntb_queue_entry *entry; int i, rc; @@ -1769,12 +1975,7 @@ static void ntb_send_link_down(struct ntb_transport_= qp *qp) if (!entry) return; =20 - entry->cb_data =3D NULL; - entry->buf =3D NULL; - entry->len =3D 0; - entry->flags =3D LINK_DOWN_FLAG; - - rc =3D ntb_process_tx(qp, entry); + rc =3D nt->backend->ops->tx_enqueue(qp, entry, NULL, NULL, 0, LINK_DOWN_F= LAG); if (rc) dev_err(&pdev->dev, "ntb: QP%d unable to send linkdown msg\n", qp->qp_num); @@ -1834,6 +2035,7 @@ ntb_transport_create_queue(void *data, struct device = *client_dev, =20 nt->qp_bitmap_free &=3D ~qp_bit; =20 + qp->qp_bit =3D qp_bit; qp->cb_data =3D data; qp->rx_handler =3D handlers->rx_handler; qp->tx_handler =3D handlers->tx_handler; @@ -1879,7 +2081,7 @@ ntb_transport_create_queue(void *data, struct device = *client_dev, qp->rx_dma_chan ? "DMA" : "CPU"); =20 for (i =3D 0; i < nt->num_rx_entries; i++) { - entry =3D kzalloc_node(sizeof(*entry), GFP_KERNEL, node); + entry =3D ntb_queue_entry_alloc(nt, qp, node); if (!entry) goto err1; =20 @@ -1890,7 +2092,7 @@ ntb_transport_create_queue(void *data, struct device = *client_dev, qp->rx_alloc_entry =3D nt->num_rx_entries; =20 for (i =3D 0; i < qp->tx_max_entry; i++) { - entry =3D kzalloc_node(sizeof(*entry), GFP_KERNEL, node); + entry =3D ntb_queue_entry_alloc(nt, qp, node); if (!entry) goto err2; =20 @@ -1908,11 +2110,11 @@ ntb_transport_create_queue(void *data, struct devic= e *client_dev, =20 err2: while ((entry =3D ntb_list_rm(&qp->ntb_tx_free_q_lock, &qp->tx_free_q))) - kfree(entry); + ntb_queue_entry_free(nt, entry); err1: qp->rx_alloc_entry =3D 0; while ((entry =3D ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_free_q))) - kfree(entry); + ntb_queue_entry_free(nt, entry); if (qp->tx_mw_dma_addr) dma_unmap_resource(qp->tx_dma_chan->device->dev, qp->tx_mw_dma_addr, qp->tx_mw_size, @@ -1935,6 +2137,7 @@ EXPORT_SYMBOL_GPL(ntb_transport_create_queue); */ void ntb_transport_free_queue(struct ntb_transport_qp *qp) { + struct ntb_transport_ctx *nt; struct pci_dev *pdev; struct ntb_queue_entry *entry; u64 qp_bit; @@ -1942,6 +2145,7 @@ void ntb_transport_free_queue(struct ntb_transport_qp= *qp) if (!qp) return; =20 + nt =3D qp->transport; pdev =3D qp->ndev->pdev; =20 qp->active =3D false; @@ -1988,26 +2192,29 @@ void ntb_transport_free_queue(struct ntb_transport_= qp *qp) =20 cancel_delayed_work_sync(&qp->link_work); =20 + if (nt->backend->ops->qp_free) + nt->backend->ops->qp_free(qp); + qp->cb_data =3D NULL; qp->rx_handler =3D NULL; qp->tx_handler =3D NULL; qp->event_handler =3D NULL; =20 while ((entry =3D ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_free_q))) - kfree(entry); + ntb_queue_entry_free(nt, entry); =20 while ((entry =3D ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_pend_q))) { dev_warn(&pdev->dev, "Freeing item from non-empty rx_pend_q\n"); - kfree(entry); + ntb_queue_entry_free(nt, entry); } =20 while ((entry =3D ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_post_q))) { dev_warn(&pdev->dev, "Freeing item from non-empty rx_post_q\n"); - kfree(entry); + ntb_queue_entry_free(nt, entry); } =20 while ((entry =3D ntb_list_rm(&qp->ntb_tx_free_q_lock, &qp->tx_free_q))) - kfree(entry); + ntb_queue_entry_free(nt, entry); =20 qp->transport->qp_bitmap_free |=3D qp_bit; =20 @@ -2061,11 +2268,13 @@ EXPORT_SYMBOL_GPL(ntb_transport_rx_remove); int ntb_transport_rx_enqueue(struct ntb_transport_qp *qp, void *cb, void *= data, unsigned int len) { + struct ntb_transport_ctx *nt; struct ntb_queue_entry *entry; =20 if (!qp) return -EINVAL; =20 + nt =3D qp->transport; entry =3D ntb_list_rm(&qp->ntb_rx_q_lock, &qp->rx_free_q); if (!entry) return -ENOMEM; @@ -2078,12 +2287,7 @@ int ntb_transport_rx_enqueue(struct ntb_transport_qp= *qp, void *cb, void *data, entry->errors =3D 0; entry->rx_index =3D 0; =20 - ntb_list_add(&qp->ntb_rx_q_lock, &entry->entry, &qp->rx_pend_q); - - if (qp->active) - tasklet_schedule(&qp->rxc_db_work); - - return 0; + return nt->backend->ops->rx_enqueue(qp, entry); } EXPORT_SYMBOL_GPL(ntb_transport_rx_enqueue); =20 @@ -2103,6 +2307,7 @@ EXPORT_SYMBOL_GPL(ntb_transport_rx_enqueue); int ntb_transport_tx_enqueue(struct ntb_transport_qp *qp, void *cb, void *= data, unsigned int len) { + struct ntb_transport_ctx *nt =3D qp->transport; struct ntb_queue_entry *entry; int rc; =20 @@ -2119,15 +2324,7 @@ int ntb_transport_tx_enqueue(struct ntb_transport_qp= *qp, void *cb, void *data, return -EBUSY; } =20 - entry->cb_data =3D cb; - entry->buf =3D data; - entry->len =3D len; - entry->flags =3D 0; - entry->errors =3D 0; - entry->retries =3D 0; - entry->tx_index =3D 0; - - rc =3D ntb_process_tx(qp, entry); + rc =3D nt->backend->ops->tx_enqueue(qp, entry, cb, data, len, 0); if (rc) ntb_list_add(&qp->ntb_tx_free_q_lock, &entry->entry, &qp->tx_free_q); @@ -2249,10 +2446,9 @@ EXPORT_SYMBOL_GPL(ntb_transport_max_size); =20 unsigned int ntb_transport_tx_free_entry(struct ntb_transport_qp *qp) { - unsigned int head =3D qp->tx_index; - unsigned int tail =3D qp->remote_rx_info->entry; + struct ntb_transport_ctx *nt =3D qp->transport; =20 - return tail >=3D head ? tail - head : qp->tx_max_entry + tail - head; + return nt->backend->ops->tx_free_entry(qp); } EXPORT_SYMBOL_GPL(ntb_transport_tx_free_entry); =20 @@ -2293,6 +2489,13 @@ static int __init ntb_transport_init(void) =20 pr_info("%s, version %s\n", NTB_TRANSPORT_DESC, NTB_TRANSPORT_VER); =20 + rc =3D ntb_transport_backend_register(&default_transport_backend); + if (rc) { + pr_err("%s: failed to register default transport backend\n", + NTB_TRANSPORT_NAME); + return rc; + } + if (debugfs_initialized()) nt_debugfs_dir =3D debugfs_create_dir(KBUILD_MODNAME, NULL); =20 @@ -2300,6 +2503,7 @@ static int __init ntb_transport_init(void) if (rc) { bus_unregister(&ntb_transport_bus); debugfs_remove_recursive(nt_debugfs_dir); + ntb_transport_backend_unregister(&default_transport_backend); } return rc; } @@ -2309,5 +2513,6 @@ static void __exit ntb_transport_exit(void) { bus_unregister(&ntb_transport_bus); debugfs_remove_recursive(nt_debugfs_dir); + ntb_transport_backend_unregister(&default_transport_backend); } module_exit(ntb_transport_exit); diff --git a/drivers/ntb/ntb_transport_internal.h b/drivers/ntb/ntb_transpo= rt_internal.h index 406033dbddb7..a7cc44c466ee 100644 --- a/drivers/ntb/ntb_transport_internal.h +++ b/drivers/ntb/ntb_transport_internal.h @@ -33,6 +33,9 @@ struct ntb_queue_entry { struct ntb_payload_header __iomem *tx_hdr; struct ntb_payload_header *rx_hdr; }; + + /* Backend-specific */ + void *priv; }; =20 struct ntb_rx_info { @@ -110,6 +113,9 @@ struct ntb_transport_qp { int msi_irq; struct ntb_msi_desc msi_desc; struct ntb_msi_desc peer_msi_desc; + + /* Backend-specific */ + void *priv; }; =20 struct ntb_transport_mw { @@ -124,12 +130,74 @@ struct ntb_transport_mw { dma_addr_t dma_addr; }; =20 +/** + * struct ntb_transport_backend_ops - ntb_transport backend operations + * @enable: Optional. Initialize backend-specific state for the + * passed @nt context on ntb_transport_attach(). + * @disable: Optional. Tear down backend-specific state initial= ized + * by @enable. Called from ntb_transport_detach() and + * attach error paths. + * @qp_init: Optional. Initialize per-QP backend-specific state= for + * @qp_num. + * @qp_free: Optional. Tear down per-QP backend-specific state + * initialized by @qp_init. + * @link_up_pre: Optional. Called before the link-up handshake. + * @link_up_post: Optional. Called after the link-up handshake. + * @link_down: Optional. Called when tearing down an established = link. + * @setup_qp_mw: Required. Program MW layout and initialize QP mapp= ings + * for @qp_num. + * @entry_priv_alloc: Optional. Allocate backend-private per-entry data. + * The returned pointer is stored in entry->priv. + * @entry_priv_free: Optional. Free per-entry private data allocated by + * @entry_priv_alloc. + * @tx_free_entry: Required. Return the number of free TX entries ava= ilable + * for enqueue on @qp. + * @tx_enqueue: Required. Backend-specific implementation of + * ntb_transport_tx_enqueue(). + * @rx_enqueue: Required. Backend-specific implementation of + * ntb_transport_rx_enqueue(). + * @rx_poll: Required. Poll RX completions and/or push newly po= sted + * RX buffers. + * @debugfs_stats_show: Required. Emit backend-specific per-QP stats into = @s. + */ +struct ntb_transport_backend_ops { + int (*enable)(struct ntb_transport_ctx *nt, unsigned int *mw_count); + void (*disable)(struct ntb_transport_ctx *nt); + int (*qp_init)(struct ntb_transport_ctx *nt, unsigned int qp_num); + void (*qp_free)(struct ntb_transport_qp *qp); + int (*link_up_pre)(struct ntb_transport_ctx *nt); + int (*link_up_post)(struct ntb_transport_ctx *nt); + void (*link_down)(struct ntb_transport_ctx *nt); + int (*setup_qp_mw)(struct ntb_transport_ctx *nt, unsigned int qp_num); + void *(*entry_priv_alloc)(void); + void (*entry_priv_free)(void *priv); + unsigned int (*tx_free_entry)(struct ntb_transport_qp *qp); + int (*tx_enqueue)(struct ntb_transport_qp *qp, + struct ntb_queue_entry *entry, + void *cb, void *data, unsigned int len, + unsigned int flags); + int (*rx_enqueue)(struct ntb_transport_qp *qp, + struct ntb_queue_entry *entry); + void (*rx_poll)(struct ntb_transport_qp *qp); + void (*debugfs_stats_show)(struct seq_file *s, + struct ntb_transport_qp *qp); +}; + +struct ntb_transport_backend { + const char *name; + const struct ntb_transport_backend_ops *ops; + struct module *owner; + struct list_head node; +}; + struct ntb_transport_ctx { struct list_head entry; struct list_head client_devs; =20 struct ntb_dev *ndev; =20 + struct ntb_transport_backend *backend; + struct ntb_transport_mw *mw_vec; struct ntb_transport_qp *qp_vec; unsigned int mw_count; @@ -157,6 +225,9 @@ struct ntb_transport_ctx { =20 /* Make sure workq of link event be executed serially */ struct mutex link_event_lock; + + /* Backend-specific context */ + void *priv; }; =20 enum { @@ -169,7 +240,16 @@ void ntb_list_add(spinlock_t *lock, struct list_head *= entry, struct ntb_queue_entry *ntb_list_rm(spinlock_t *lock, struct list_head *li= st); struct ntb_queue_entry *ntb_list_mv(spinlock_t *lock, struct list_head *li= st, struct list_head *to_list); +struct ntb_queue_entry *ntb_queue_entry_alloc(struct ntb_transport_ctx *nt, + struct ntb_transport_qp *qp, + int node); void ntb_qp_link_down(struct ntb_transport_qp *qp); +int ntb_transport_init_queue(struct ntb_transport_ctx *nt, + unsigned int qp_num); + +int ntb_transport_backend_register(struct ntb_transport_backend *b); +void ntb_transport_backend_unregister(struct ntb_transport_backend *b); + int ntb_transport_attach(struct ntb_dev *ndev, const char *backend_name, bool use_msi, unsigned long max_mw_size, unsigned int transport_mtu, --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020105.outbound.protection.outlook.com [52.101.229.105]) (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 A102F33B6DA; Sun, 18 Jan 2026 13:55:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744534; cv=fail; b=qVWm8nmdX8zE7S80CJkdl4fd71NrIQaqyjUap/M9pKN9mriQmU15zh41nGfObvI2vf5w7pVLmFkhUtM/+CPdeCJwJ7oQT7JEJgpvJzj1bSvjQLsHms3TRuXzmuCkD9k65QT0qadE1A+xriQypm2JFZKJXa2nPyO6wN0YB5j7elc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744534; c=relaxed/simple; bh=yOgg90bn+TbyK+EkOgU6sgdcXqycSB3wkAswnG18YrY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=kUS2/cX0hKjbW7eMKp5qYAnE4f8DhniuJ+DFNF5g/FejUVlDU8WiWAddp32kSRJBWU6gvfSu03lMdgFpLUtW7h5CIrqVIgh+qw5JT+NIZQgntCMjisK95yPhO0J256YcfJyj+V8Opl/VYj5Sro2z702WIBaXRlpIlcUmEEQQaa4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=lPg7Yxnx; arc=fail smtp.client-ip=52.101.229.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="lPg7Yxnx" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HLOZd/kkuoIPCxdozL534tDAaiziT471W9hlHNnxgIQ1xXqS1zRVjBXkmib9/1XVUpLXJs85kyJ9n3wTZVdzNLe1qtNXj06+KGJPp+IzJCtkBilNIAM1hi2gYPZbjL+6fOfrl+sMgdazj/UJh+Domw6qMFjnpQpMTKVX+xl+hZ9H0R+7l5NJjuZJ5CoDzqemvzuWxauaORnC4Eu/zuaYjnaJlXYVHynltWs+7TeW97aoQG5FncBRGESdd3jUCzJ5fhELcc1Kc7USTYSUAx+eDIUsWBIGldY2/iMJo1Ltd0ybb0fKBLCuIOhIlehkUw7Rqomtm0gF2Bn6x2OnjWFSxA== 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=uPI+aEiG+02KSiVUSxI06CQ1pW3rO8Rq2croOS4o0e0=; b=qS1/ZxNgRPCHbNZCHc7O+umGycF0sialXRMl/bNvboTW7iUYZb/dmpY1QAwFjwKtPItm4G0ONc2GKYRdn0olTDEIVHqunbrZhQQHwr4h77KIbLjrPGWAXyEHFex+K6h091XKhyNMbCZMPBvbe/bJYVosl4W3WNYJggxfdb44R4HVRtVHaVgPSzTvZSQVpNW1YxgRPy9ndRIhqJAFYwIb3RkHQP/zpQtvrFPAVMXc+BKfzF1K9f8tdv1XUZCMiIVbLuZqeqqxqNSxYfJlCWzvfTrw9eNwUKZlYGNWr8E1alP5GK6gphXu3EAyBu/PXkdyQ00/mXOyDLHXIU7NQ7gOqA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=uPI+aEiG+02KSiVUSxI06CQ1pW3rO8Rq2croOS4o0e0=; b=lPg7YxnxDubwcZBMJy9dRlzJ8/KlfOzdm+vvDrXFlnGxsGR97gAKhQI01TvanWoDroxoSMiIr+a/CTLIe9QyX/UNx1kRiFDd6p+mNGLRB1+3S02/dZIN4uOS1rSmmDi1p9qNrytDyIG6j35UqyhsDe1IIHF7suh/KetG9Rc6KAk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:12 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:12 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 24/38] NTB: ntb_transport: Run ntb_set_mw() before link-up negotiation Date: Sun, 18 Jan 2026 22:54:26 +0900 Message-ID: <20260118135440.1958279-25-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0122.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:37c::7) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: a85bb668-09ae-42dd-4b3e-08de56993329 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?RBlK2djq2RmOhkDHD3pyUVdRCRwraffekNsOQLZHJQBpGTx7k9ZGIlW1LpqH?= =?us-ascii?Q?q07EITLi8uAx2UpBZUCoG4Zw3xw4qvDOYXTLAYD7JqCA7xf0tvsJv6lzUA89?= =?us-ascii?Q?b7TL585Lk6civDry5SgAEcbB/9W5DA6sWxYG6Ca0kfUPiLd/D8Rw84BoqMUN?= =?us-ascii?Q?bAu9BRj/G/UQgS07H6u5vJ68Hx9A0OToCKcA7F303VH3V8vl3vrWm76USJun?= =?us-ascii?Q?gMCIZuDvAyUEuDUHqUs0kvAO4Ig7iosTZr+if2Q7X5nYPtqi8YWXktaqLW6b?= =?us-ascii?Q?2KJ9oLyASTT5cU41t8HHZzv8Lvh9cLEIv7GvIVhVEUb9jXpUprjOUKb6D3dn?= =?us-ascii?Q?d3aKVsH27JWaEPhjc6Pn+hDDCkiEGfg/qjUbUsAlAt7njzLyImytGgbvgnZV?= =?us-ascii?Q?wgwcsHcl5QMmz28bmejS1f3TFo1575m11bhxDAkGQ4MBUiEjabznDM5pjW4S?= =?us-ascii?Q?OPuhRHH487vVgLTAxi96tiJ0VeqKSnpSZTAi1GuINN+HfV/3cMWdHYG70NxI?= =?us-ascii?Q?jTsil+fW4ZS6K+g5B9iWkY46MtxTQJMZtX4FVVELgBrSCGctW5nUcGZZzUXO?= =?us-ascii?Q?7R14LAq2174va6pphVTf1MsjMZpqwQYG4/ErNPb7/UUWGWsun7Abb+J6j+9M?= =?us-ascii?Q?ZTUSysogy8FK5zcWh4OuY4QJXTN+uQN10SsDV+BgVMnVfI0YZkCt7f7uFV34?= =?us-ascii?Q?1qj8LWrLHUKt+JgigQAum7xdgb7OWCxu7l8ywVthoJICGlwwKUrQfJe03kJT?= =?us-ascii?Q?YDcE3OleGWn/swWfTCOEryBA8BN5f8yAX0c1BSukbjFncJTszC1pEzJCCbba?= =?us-ascii?Q?lyVEFDkv2R66KNVM80xCY/I2/IgdlWccQOSvQxXCtMVmln90zNYeqaMWl+iT?= =?us-ascii?Q?FBtPwMtqilhHPulMr/jWgw+JsEVLhV9jhkA8fl0QcqmnSwJFWjHCsODRk6Xg?= =?us-ascii?Q?q86c6iWXY4CWybaGvjxNj2FPDHqV+JR1IZT13wbnkt642x2EJe3a7zHr7wgQ?= =?us-ascii?Q?JpUcXb4zoo/2bK6AnUVkZ2wpstHTojV3E7GqTmDHz1LnxzAh+JuQyluOBof4?= =?us-ascii?Q?Km6zYSBgCWXnxDt9MY5iGJleDTpLbjiAe8UzgBTJn53aneNNaQ1yH+12UU+7?= =?us-ascii?Q?fXZhtfAbw0P3F8fGNGXMVGWCbxECvIDh2oyR4kKdTRxgJojqjt7KxwcJZetF?= =?us-ascii?Q?7qWxYsmFr9n8pE6LkR40mxDXa4uKTRBChxEbQnTZoNekBORac39G48R4+fwF?= =?us-ascii?Q?aKz7lkpRx6PcIh+ydB2hDzrAkB3H2dLMcfmyXpQ2p/TOu9JS192PLviwU3qr?= =?us-ascii?Q?hrtLehdeR4cJsfhxd6jBh2utxWI4TIJkfbfTe4V7XIEtsgsDrCh3Ng4+uapp?= =?us-ascii?Q?CcUxOoBQ29z2F51tyl7bPbm8kapOGK/vBtvSZGzPS6RYguHu/jmj+/1mhkjD?= =?us-ascii?Q?dDgdifozRALC74aNYAdm7QHZVi6Ie3bkBuQc9HF1AVX40f0UFajlCqr+Jzqe?= =?us-ascii?Q?9W2DInD8jm43KvLTdwHB3qsfO+OeG3WD9a0GkstGvWTdQz2ZoWFsSiLuE0Co?= =?us-ascii?Q?R0LWqjBMrulWvNP/x5p8hxbMMQqv5t3QXtetVBOwhAWw1JEmF7e0mJeOYOrI?= =?us-ascii?Q?eQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?WC3sl1ujWLaKCMyj0oHLl6gXOgz020b7/he7x59lvMH7VPqKtwaB4ifpqIRs?= =?us-ascii?Q?TaTnVPB4rcCnnUapPrr7KbhR+2byhtT3ylQEh0n0G+s5PWicMSS7JVnR5zad?= =?us-ascii?Q?2NyMbwLpvvCF96DyG60s8YWwJWdPD7tWTcVsxHispBe1Ptwv36YpV/xwZjmj?= =?us-ascii?Q?84UsKwUKKHzHhQPlFkGvUA1PQ0cRzgBP27EemO+mpjHiTlMrKK5p5VE2p/At?= =?us-ascii?Q?wpVAp7V6uuTSJHdl5t06RRdpeEzDf+qadSE0vvhHMQTMHWrKJyrLFDXzWKfO?= =?us-ascii?Q?9UuFrwFfvgJCClM0x0sCmbMaiUje/gf6TBOtYK+e0NoehYJrehh7MdASxOop?= =?us-ascii?Q?/gvrz9YDPojjDracZ/ewiUOjuhctAWgaBDZnu2/26KAs7YhOycXyGkCrIekH?= =?us-ascii?Q?1fmSawiPVea7eMNd4s+6rpsyFMWaC/jQ/ckUF/UZDL5414Vez2f5NmbBFFET?= =?us-ascii?Q?Rcc4tRU/pFjsxH0zwMTAqDPynnMQvDx3aLgWFEnjd78FRr9pNlduDqoOS0h5?= =?us-ascii?Q?4GSujNPPI+LjS+oxWHvahzZ6SCef63Ble1SQ6vMftOU+XwLWnKKjmVuIgqTi?= =?us-ascii?Q?7DgbuEouZrMH4sn2ypZpV9reE/8vHTVnarDnc4se5SsZjx3HwntNyO30mT/F?= =?us-ascii?Q?4ns3P3NfSJ8qBoBj5F9zpZIbUFbvcmxRES+pX2eEn5HGXivjrm4PCbwyS7pf?= =?us-ascii?Q?xhlJPsa+KFOGaHZNEE1advhJH5BrQsuNeWlZvGqmmJ/hhpAVvisEtDGw83Da?= =?us-ascii?Q?Ym52RBgR1zbQRzZRxPZkQDPIYkrCo6emHnIVZu8G3QXB8f4+IAsBJYy8bgsD?= =?us-ascii?Q?U3jbbV7dlaZ1FR7J8KwJLVgl5bUcdyFH0yVJwJLZTl3ny5Y3/OaprRwDipjB?= =?us-ascii?Q?WlhqLIOs+DYnFluqTZ4LhxdXfT1zXEqRzBxn7xBVl1lFbl/qvSsbaiRL6NYK?= =?us-ascii?Q?bEg4c+GOu4cH9RTbgSilzNhuBveV0V7i3RTipXFfbH0gVnDijw5OVrH0Zltj?= =?us-ascii?Q?1S6CCTHQ1tsz9u38x2EFqRhi9T3nEX+NUDEKyX/2983pWh4QCW0S96NUnlPa?= =?us-ascii?Q?HVxg63MjG28fl1jXUntOTQ1QHoAsv57K5spKQq2uendaNCY6bFYwnat5A0Gk?= =?us-ascii?Q?vg/Xg+zxBpmCM6McrDk9Q1WZmuF5goW9X+qjnmm3nXHhoRiZ3coDG33UdLK0?= =?us-ascii?Q?FH8aJjabPnSTbREleRUc8HYprdVuwT3nXhtFJXap7HHIeXaLSQ3SXu4beOQz?= =?us-ascii?Q?mVIRjGsHb7e51QqHu606Fp0BF2shYctbKxonnPyLl1gVWMQF3NObtEodHEy6?= =?us-ascii?Q?t7lpBbUGb3PGPSLyXNsRZzAN4sxZq1GV0ESHa1qPgFwn26lOd9duHAmnBBaV?= =?us-ascii?Q?1n1BzaDmptHl1LgK7ByKHeNwB75wKeq40KRkmjVE3cvzpokby1F4YGoM97+M?= =?us-ascii?Q?o8+echj+woPeSUuJBtgIQZCXVlZ9nnEHtCV2NWIvAI/4gvmLLSn2ObPUDda2?= =?us-ascii?Q?ZwxVVtF2QkATUlxmVAi4BIs7WTCi9Kn22kQ9Al1WolMjkLpatasG6+pu5Joj?= =?us-ascii?Q?xEBaCh1qYQI/7+F8yKQoKkf5Yf5xs3ILfrdvub2xsTHv+In72r9wSBtXk3iT?= =?us-ascii?Q?ac1iLCUxED2Ppy6NBT+b5dJQ0ws080i1RCmZ4CiM7uU6Mem4RVg+e0mBaK7J?= =?us-ascii?Q?kAkA0U3k2K5lPw9VaLAyeOqML9OKQMk1MazeHU55SCzuNI0aHuut/gVfgYA2?= =?us-ascii?Q?dl3RW3oC8KApqwOBTZ25ELDc2lzODWv6hqlyPjkK7c1AchiMr7K1?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: a85bb668-09ae-42dd-4b3e-08de56993329 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:12.1886 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 3G1Q2K07jYdU+kMAvZQHLRDBa1ujWtIPZx5nlMNrpwaUoYEfc2dLkLbjzivFBFihjV2vwxoE4+o7fBIijTukXA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Some backends may need to program BAR subrange mappings, and due to pci_epc_set_bar() submap API constraint, the entire BAR layout needs to be provided when calling the function. Since one MW that is to be programmed by ntb_set_mw() can be the last piece that allows us to call pci_epc_set_bar() for the BAR, calling it only after link-up can race with post-link-up setup on the host. Invoke ntb_set_mw() before the link-up handshake so the MW translation is established early and the post-link-up setup can run without relying on late MW programming. Since ntb_set_mw() can re-setup the MW when it turns out that the size differs, it's safe to do so. Signed-off-by: Koichiro Den --- drivers/ntb/ntb_transport_core.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/ntb/ntb_transport_core.c b/drivers/ntb/ntb_transport_c= ore.c index 2129fa7a22d8..185d73f8ea93 100644 --- a/drivers/ntb/ntb_transport_core.c +++ b/drivers/ntb/ntb_transport_core.c @@ -977,6 +977,10 @@ static void ntb_transport_link_work(struct work_struct= *work) =20 spad =3D MW0_SZ_LOW + (i * 2); ntb_peer_spad_write(ndev, PIDX, spad, lower_32_bits(size)); + + rc =3D ntb_set_mw(nt, i, size); + if (rc) + goto out; } =20 ntb_peer_spad_write(ndev, PIDX, NUM_MWS, nt->mw_count); @@ -1032,6 +1036,7 @@ static void ntb_transport_link_work(struct work_struc= t *work) =20 dev_dbg(&pdev->dev, "Remote MW%d size =3D %#llx\n", i, val64); =20 + /* If it turns out that the size differs, reconfigure it */ rc =3D ntb_set_mw(nt, i, val64); if (rc) goto out1; --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020105.outbound.protection.outlook.com [52.101.229.105]) (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 EE25E33D6D7; Sun, 18 Jan 2026 13:55:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744544; cv=fail; b=nL2aI6BmdWsjOcMUS9jEddrX7ipPFJXYph5X9qc0yDCZ3xHuDPQcF+CRYY1VNiuCQRzho1EH9m18qkxepRN2fENN6SNjjuMC4+Yhb6l8QzclHBA+XMUEM/XkgXMIuULsHzoQjdKWBjOEeFJ6mlnGEyWC8GDUTsg18+cGbi5lJ9s= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744544; c=relaxed/simple; bh=uGnlQ2PKyYO7KnYnWbg49+UNC1+0bLtSu6mi3PzDiHU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=NfkOvuX3z0QPHX3ktEYPS7QNq87dctGSjZCTBifvHAm9tSWSsMaErybL1QjxiLOU1cYeu5XkRATjVLFl+sPqhR80e1jwkLNXgW5hxs8d3dL6LPM1iuKrZ/ZfyIy4HOVqnvcSMUiLvQkL1OIUz62CQ0+YpcObKy7qvD5jPmyndBs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=gq2o3TEG; arc=fail smtp.client-ip=52.101.229.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="gq2o3TEG" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=O1rORaDGkK6N1gH04yn0CbdS7bpB7zfJ6VKdtVdiYnAhybF0U5Qo6KFiefAZJpy0CRDTX/dQ+P3GexOloDSRyt8joWpovKvaYv5GMxN0GIerJZ28f5l+JOkHzmK/Wez/FWRibCvB4WHxNxoOPwt3MDQ1rEi+vMqGuPfb45gphqfcI/EE9O9OerDnK8d2C5nWchVrYRySj/EfYkppgeJmdm3PUSV/lHxGzqGiukY1Lc3DJRvU7l6nGrCHGhhbNu8RqdiB4ZK9YwcM3ZXi64BwJ+kn47X058L6H9J3rTqTzHgjN7DqeLICmavzXb7JJW82frxIekSxUfX9beJ/ckKVSA== 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=vxvkdWNzuAtzk0P9K+h694XSenPbDbIXDM7V7SNkv9o=; b=VUBpl/Og5AWPBmbuClfHsG9P5jvYD4QQ8FovCwNgrw9O/V3U2qoZwTdylMMaMWq6NUSmALBYBna/DFYEMjvxJHbfC75BJluS1ngLjuBotPwo3jxqgDptb86lBky4LtFV7fmQX6NRyTAgA5Qaq6Rjitnf7EGVvk9GIf4whj6U+lDvGX/aAOSixCdft3RtMjJtk6hpS98zS2Spt2zbgJwiSTo2QbtKXKPfIFq+5UBLdpSHb783MxeKBMemaUPCX98U3ebbeid2Wx3YY6tU5doa2TXsrlhh5Lpb1fYqv/DsucnyH7pC+73L88fTjyGxdIBKJtj6Rj1757u7+BIhmZI0kQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vxvkdWNzuAtzk0P9K+h694XSenPbDbIXDM7V7SNkv9o=; b=gq2o3TEGn+UTD71VN0Y+xiMsIw92NwRIOKFFU+B3AYGS2KEhgayWMPVdFLrwaZd7H26mAN+kBTFwWRg7WJlYP2JuJ3HyfM66Y5G3s4H9Fp4ch6g9q1XlxPsq0X2TkLOQQtCDAUZUQRjJmgul9XCqu9ByI6A7mAizzyFGtkMquhc= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:13 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:13 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 25/38] NTB: hw: Add remote eDMA backend registry and DesignWare backend Date: Sun, 18 Jan 2026 22:54:27 +0900 Message-ID: <20260118135440.1958279-26-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0063.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:371::14) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: b670fb6e-319a-4a89-4c2e-08de5699339f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?0AuB9T8saDahFEifdDIaNiayEC4bm3nPlqo1Lgg5AUobszHNzUncgtVQgjhh?= =?us-ascii?Q?2dg6TgIygbG/U55Hejpsh8lv6M2B8Blq+boNryhIyg31lW+HjP5Q6Qkf4owO?= =?us-ascii?Q?Aq8LkFOIYPmhMvARKk3SNAdrh3Yz+6ShEVvpqSFwx5jnGZQcJZLSQsmmNoVk?= =?us-ascii?Q?JIa6UxvztWBj5pxtrN+fb61n1fS/2IhBXsihg5U726Lb8RC8lijTtKYEuUUT?= =?us-ascii?Q?ImP/UTAyw0uBIzSsE9UcGMDPO5A6ng2e+1Pg/CcL/HCF/0dFqrxd3ZCD/o1q?= =?us-ascii?Q?YYKYdBhHDg9MvhZa2AftB7zVARg9U4crKIWSQqqx3XUqMP+mRSXbzPQ86jZX?= =?us-ascii?Q?UdhV/OR1uCJx1yaMMaWN2cmbIFiDBR1YmAqthTOHN4X9YlLGEyOIqEfMyzZH?= =?us-ascii?Q?2sAZhFeDW9Ehmpphr0J8RcZipBEU9rwdRTpEQkLaIJspqowOIkbJo4qOCfcP?= =?us-ascii?Q?oypFZ6wZkyO5iilbI3kXNxcPxJ/bpg4ropOXM11skuhjGWe8LzkafnK2lZ3r?= =?us-ascii?Q?oby1D0r4RH4XLF3sMvUt0TzEyZm+tDOGqfShUbLXdkZpQ73n1uPQMDN08/+H?= =?us-ascii?Q?ZnATglEcwNfyp1WVdMssQPEcHRABvydsuCYwZncA2LQaJ5r6Lhw7LxsSDDOa?= =?us-ascii?Q?yhd/p/cPfIiCbUbYkf4VrPcqAPL2WS2n1X83ZgkEbB2xcAZS0yHloo6izDFh?= =?us-ascii?Q?SqZHeFITVCN8qEB0eSGUUGnJ3HnagIH/6N1BmHBZXOp66P1SSZ/KdMhqh52K?= =?us-ascii?Q?FYCoo/UPIKPn2OnJ+MO/0GcsMJXn0JUtDMA7nXmXbBgCIypiw692cj2w3gNz?= =?us-ascii?Q?PDVxTAeOALylAtqSrWvWf9Oskwa4VW/nTU3BhzX/6Rrvs9qNrPtHRHapjdNM?= =?us-ascii?Q?KcP3clb2VJaizutEJwGGKmAaaQ2ppf+MMP+eNjDTKekmsZDwb0qFQZD3GrCD?= =?us-ascii?Q?ZvSPP8WzCa3ezjQyHS6SCQu02eezy9ekQSvNEi4uw1s7V0Fn8d/zAXIUo/kL?= =?us-ascii?Q?uBchzqmEhHUN1jf8Rei6fHAtJAAJzPzoEb475qwxBC/hRC9sjlocsVq9I96v?= =?us-ascii?Q?BnH7v12yI1HYosPcY9BWMeB502XXDCFIsV6c3NyvVd9Ffa6swh9tbLtdXgQv?= =?us-ascii?Q?OyjngTSLd8KcPxmjq07WlWKFchnFj5oZLU/h/x7+ZBQdXHvWsrRUPelqwM3F?= =?us-ascii?Q?TpAMOYcPXRcZ0s/IJE/Dg51h8HjlMxqUxb29shUc8ylkqhYBB8IqWXAhcTKx?= =?us-ascii?Q?md0zc432e3eJodYlPzKuO341WFImHhi4IOjuJG4Xy/rwZCokCSmSnjO3k3yV?= =?us-ascii?Q?C6daKmA3yPVrTei6lxHxaHJhkHKSAM8LkTXOOi4EVgcYgkkFX3qTAtShdW+l?= =?us-ascii?Q?aStXLWDIX5sNaBfkbRtVzMsPp2DzWCcUC/WTH1Oj0/7oyKliMd1AufEmQ7Em?= =?us-ascii?Q?NcyOZWDES6J/ou28VCd8h48LN/a0VH3odJfeOsu6sGouZbdENWq/GnkncHwT?= =?us-ascii?Q?TEH0Fo0frkUFfg5XT2z0S8S8YtaewGD/y7RdRO9cPYZq4/f3rHoQhj5npkNn?= =?us-ascii?Q?Wb4FThORE/pfGW5tNjf8E/UsBoaGvj5JeBa/9P2QYzaStjeCTwAuIReGOrWs?= =?us-ascii?Q?YQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?baCkaPmWTMzHnmT7Jw8owIZgCi0dIGO4aV/+kPyNTLEAcwhZJ9yShLktxtth?= =?us-ascii?Q?6NeHF6AkbwNKBSVhwlM+fXvp9Fr8o3fZMuZQUtrd/ChHYuI4TMJL/0dRd8O2?= =?us-ascii?Q?lCCqDWFa130xLeKx2UmLGVp5hXYeQFgfGDvZghddu3+msq6BLphJf+ZqTD7U?= =?us-ascii?Q?Tflg+zxHBmLumfBx1f5k5gx9QcaX+Aj7EKKbhB3my4A9hRxteLGZmbslot6P?= =?us-ascii?Q?8i+Ll3gf486UNEV6LqUQ+W1TvF56YPRudXZ1CKyu5NozzAxKP0dOnjQDcn2U?= =?us-ascii?Q?n0uTA2Uii/81AhLr2euflfs1EgRQAcgEAZz7fe1s0Q7l0lY9Xd4W/UQct7xA?= =?us-ascii?Q?8E+2P5Rsk2hXCHXibgB5lM/xTwtc7qrTqOtbhtehIvf1CwrKIg60f/beyTpS?= =?us-ascii?Q?G3Hp3otV4Qao7HZYAT+6rLDXW6RCB/7kHHnXgh5kvOMgg2vP9T1agCUXm+mb?= =?us-ascii?Q?ngEA8dlDKNAmHFIsKmZ5rkdyAZIGTZ/yLUdFlRgoBubaCIm1i5kwxotxRWF/?= =?us-ascii?Q?/OyQB/sUelf6ktWnWUUSD3l5PmQClWlgZ9BHP1vI85wiPh68vELSPXWUI/h3?= =?us-ascii?Q?PP+HuwZuY1ULQBfXRT8WfApbPKrfUQw/DjxVBHubPpQs/Kr1S/Dhrgjs5+sj?= =?us-ascii?Q?p8oBFtpfSXPu6/HAvJ4m61n+fq2XENrfiFR0+uO+AhRvfe8KWxBOe82FZzZt?= =?us-ascii?Q?UMwcBmRoIq60JDIS8sJz9w9yY/PZCDpyzrvRl6FXw71vYAP5jwSZFlFRSweL?= =?us-ascii?Q?qyyq3aR0iLo2xOPqRaIIbzIjwPnBZWlE6CVH3zFuko/cS3f+/JRT0+PjHn3z?= =?us-ascii?Q?NwU8mYrR7ywIBweD/nBOl7QomCo/1TP1irMe0Abb3C3rwFawWKdPoJqaZHvR?= =?us-ascii?Q?hJUD8p1as6z8EZWURElfkxUBAoXHaAKxUCtK0EnPZDgtYhgD1w7eaK+pKvLA?= =?us-ascii?Q?pLwcO/Cj1g5jzIwXxCDMbfA0LtPWNcifmU7hAqYomdecUm7uupLaOl+GN7JM?= =?us-ascii?Q?HKma3OB+moabD8M6cilTtisAQKmdHVRQUAVLFQuMPk3uOKUmOmCZvgQa+u9c?= =?us-ascii?Q?gXJP9uiKu//1fMZqLyWLyRQs5BgXw1Um8YES/dD7zjRR/IZRcxVzK2mGA3ki?= =?us-ascii?Q?xiknGxIAmSs4iygGUUxMjlVcVjYGLMdfjW/6DXHuQ2qjviTxLlpUjYMNB+2i?= =?us-ascii?Q?wBHFC2b1fdFYKHMkui7hRZ212KsNy8nIDTXSs5orRNXVJe17Zp9RbMA60CX9?= =?us-ascii?Q?aF3wpxI2vdmdBkER5SO7Bc2jmJ2VyuTG7mG/b8ZeJGcXL3oARePLZXlCVPgD?= =?us-ascii?Q?HvYxWuAIceXKyoFsSb5i/GGwkTxHl9zyw2Eq2oNAdkbPioJYxbkFQmaEU1DK?= =?us-ascii?Q?Ce9D4AqO4jEiWdQwLWLdTECeHKd9OEhgYLESHviJ/Rs9a4/b2d6E5KQOS5Ei?= =?us-ascii?Q?MKEhCoWifkaZHq3ZvYV/XUp3EIzk4GmDp8WUGp+QK6vHTH+D4IWEglfbAKTT?= =?us-ascii?Q?TkY+/ujozu58VC2N/f713CHOx7zrcQM7sCToGcfoZBa7GDm+/vB+LGvgz2Na?= =?us-ascii?Q?dc5BBMwPiCluOeR0ymEpna7/Dk7xkqJQm2XKWG1xPv+45WDnV+WzhL+khn9d?= =?us-ascii?Q?ySrn6REMRE1G+4Ndqe/AvXW8zu/Fy/DAZpa5UoEc7y+7cupnyMmZctVSU9O6?= =?us-ascii?Q?W3ZAfOJuYKcveCOIlaTrh/LkH5wBBbD9ccAaTI5Bv4ouwpia23ZsegkELLY1?= =?us-ascii?Q?p36isoGw04g5QDtWTCgcPIwuwfBVpsxb3XMiZnL4ZwFARiki0lqZ?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: b670fb6e-319a-4a89-4c2e-08de5699339f X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:12.9794 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: /MXkiP64dXKhuDkBhLQwK/gINsNrE1Ol977vuVx+u02fJpZCN6g44HjofVZaoKHRAMirn/d1f1ovckWd3s5/Lw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Introduce a common registry for NTB remote embedded-DMA (eDMA) backends. Vendor-specific backend drivers register here and the transport backend selects an implementation based on match score. Add an initial backend for Synopsys DesignWare eDMA. The backend handles exposing the peer-visible eDMA register window and LL rings and provides the plumbing needed by the remote-eDMA transport backend. Signed-off-by: Koichiro Den --- drivers/ntb/hw/Kconfig | 1 + drivers/ntb/hw/Makefile | 1 + drivers/ntb/hw/edma/Kconfig | 28 + drivers/ntb/hw/edma/Makefile | 5 + drivers/ntb/hw/edma/backend.c | 87 +++ drivers/ntb/hw/edma/backend.h | 102 ++++ drivers/ntb/hw/edma/ntb_dw_edma.c | 977 ++++++++++++++++++++++++++++++ 7 files changed, 1201 insertions(+) create mode 100644 drivers/ntb/hw/edma/Kconfig create mode 100644 drivers/ntb/hw/edma/Makefile create mode 100644 drivers/ntb/hw/edma/backend.c create mode 100644 drivers/ntb/hw/edma/backend.h create mode 100644 drivers/ntb/hw/edma/ntb_dw_edma.c diff --git a/drivers/ntb/hw/Kconfig b/drivers/ntb/hw/Kconfig index c325be526b80..4d281f258643 100644 --- a/drivers/ntb/hw/Kconfig +++ b/drivers/ntb/hw/Kconfig @@ -1,5 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only source "drivers/ntb/hw/amd/Kconfig" +source "drivers/ntb/hw/edma/Kconfig" source "drivers/ntb/hw/idt/Kconfig" source "drivers/ntb/hw/intel/Kconfig" source "drivers/ntb/hw/epf/Kconfig" diff --git a/drivers/ntb/hw/Makefile b/drivers/ntb/hw/Makefile index 223ca592b5f9..05fcdd7d56b7 100644 --- a/drivers/ntb/hw/Makefile +++ b/drivers/ntb/hw/Makefile @@ -1,5 +1,6 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_NTB_AMD) +=3D amd/ +obj-$(CONFIG_NTB_EDMA) +=3D edma/ obj-$(CONFIG_NTB_IDT) +=3D idt/ obj-$(CONFIG_NTB_INTEL) +=3D intel/ obj-$(CONFIG_NTB_EPF) +=3D epf/ diff --git a/drivers/ntb/hw/edma/Kconfig b/drivers/ntb/hw/edma/Kconfig new file mode 100644 index 000000000000..e1e82570c8ac --- /dev/null +++ b/drivers/ntb/hw/edma/Kconfig @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0-only + +config NTB_EDMA + tristate "NTB PCI EP embedded DMA backend registry" + help + Common registry for NTB remote embedded-DMA (eDMA) backends. + Vendor-specific backend drivers register themselves here, and the + remote-eDMA transport backend (NTB_TRANSPORT_EDMA) selects a backend + based on match() score. + + To compile this as a module, choose M here: the module will be called + ntb_edma. + + If unsure, say N. + +config NTB_DW_EDMA + tristate "DesignWare eDMA backend for NTB PCI EP embedded DMA" + depends on DW_EDMA + select NTB_EDMA + select DMA_ENGINE + help + Backend implementation for Synopsys DesignWare PCIe embedded DMA (eDMA) + used with the NTB remote-eDMA transport backend. + + To compile this driver as a module, choose M here: the module will be + called ntb_dw_edma. + + If unsure, say N. diff --git a/drivers/ntb/hw/edma/Makefile b/drivers/ntb/hw/edma/Makefile new file mode 100644 index 000000000000..993a5efd64f8 --- /dev/null +++ b/drivers/ntb/hw/edma/Makefile @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0-only +obj-$(CONFIG_NTB_EDMA) +=3D ntb_edma.o +ntb_edma-y :=3D backend.o + +obj-$(CONFIG_NTB_DW_EDMA) +=3D ntb_dw_edma.o diff --git a/drivers/ntb/hw/edma/backend.c b/drivers/ntb/hw/edma/backend.c new file mode 100644 index 000000000000..b59100c07908 --- /dev/null +++ b/drivers/ntb/hw/edma/backend.c @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) +/* + * Generic NTB remote PCI embedded DMA backend registry. + * + * The registry provides a vendor-agnostic rendezvous point for transport + * backends that want to use a peer-exposed embedded DMA engine. + */ + +#include +#include +#include +#include + +#include "backend.h" + +static LIST_HEAD(ntb_edma_backends); +static DEFINE_MUTEX(ntb_edma_backends_lock); + +int ntb_edma_backend_register(struct ntb_edma_backend *be) +{ + struct ntb_edma_backend *tmp; + + if (!be || !be->name || !be->ops) + return -EINVAL; + + scoped_guard(mutex, &ntb_edma_backends_lock) { + list_for_each_entry(tmp, &ntb_edma_backends, node) { + if (!strcmp(tmp->name, be->name)) + return -EEXIST; + } + list_add_tail(&be->node, &ntb_edma_backends); + } + + ntb_bus_reprobe(); + return 0; +} +EXPORT_SYMBOL_GPL(ntb_edma_backend_register); + +void ntb_edma_backend_unregister(struct ntb_edma_backend *be) +{ + if (!be) + return; + + guard(mutex)(&ntb_edma_backends_lock); + list_del_init(&be->node); +} +EXPORT_SYMBOL_GPL(ntb_edma_backend_unregister); + +const struct ntb_edma_backend * +ntb_edma_backend_get(struct ntb_dev *ndev) +{ + const struct ntb_edma_backend *best =3D NULL, *be; + int best_score =3D INT_MIN, score; + + guard(mutex)(&ntb_edma_backends_lock); + list_for_each_entry(be, &ntb_edma_backends, node) { + score =3D be->ops->match ? be->ops->match(ndev) : -ENODEV; + if (score >=3D 0 && score > best_score) { + best =3D be; + best_score =3D score; + } + } + if (best && !try_module_get(best->owner)) + best =3D NULL; + return best; +} +EXPORT_SYMBOL_GPL(ntb_edma_backend_get); + +void ntb_edma_backend_put(const struct ntb_edma_backend *be) +{ + module_put(be->owner); +} +EXPORT_SYMBOL_GPL(ntb_edma_backend_put); + +static int __init ntb_edma_init(void) +{ + return 0; +} +module_init(ntb_edma_init); + +static void __exit ntb_edma_exit(void) +{ +} +module_exit(ntb_edma_exit); + +MODULE_DESCRIPTION("NTB remote embedded DMA backend registry"); +MODULE_LICENSE("Dual BSD/GPL"); diff --git a/drivers/ntb/hw/edma/backend.h b/drivers/ntb/hw/edma/backend.h new file mode 100644 index 000000000000..c15a78fd4063 --- /dev/null +++ b/drivers/ntb/hw/edma/backend.h @@ -0,0 +1,102 @@ +/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */ + +#ifndef _NTB_HW_EDMA_BACKEND_H_ +#define _NTB_HW_EDMA_BACKEND_H_ + +#include +#include +#include +#include + +#define NTB_EDMA_CH_NUM 4 + +/* + * REMOTE_EDMA_EP: + * Endpoint owns the eDMA engine and pushes descriptors into a shared MW. + * + * REMOTE_EDMA_RC: + * Root Complex controls the endpoint eDMA through the shared MW and + * drives reads/writes on behalf of the host. + */ +typedef enum { + REMOTE_EDMA_UNKNOWN, + REMOTE_EDMA_EP, + REMOTE_EDMA_RC, +} remote_edma_mode_t; + +struct ntb_edma_chans { + struct device *dev; + + struct dma_chan *chan[NTB_EDMA_CH_NUM]; + struct dma_chan *intr_chan; + + unsigned int num_chans; + atomic_t cur_chan; + + struct mutex lock; +}; + +/** + * struct ntb_edma_backend_ops - operations for a remote embedded-DMA back= end + * + * A backend provides the hardware-specific plumbing required by the + * ntb_transport remote-eDMA backend, such as exposing peer-mappable resou= rces + * via an NTB MW, setting up DMA channels, and delivering peer notificatio= ns. + * + * @match: Optional. Return a non-negative score if this backend + * supports @ndev. Higher score wins. Return a negative + * errno otherwise. + * @alloc: Allocate backend-private per-device state and store + * it in *@priv. Called once during transport backend + * initialization. + * @free: Free backend-private state allocated by @alloc. + * @ep_publish: EP-side control plane. Publish peer-accessible resour= ces + * via MW @mw_index for @qp_count queue pairs, and arm + * the notification path. When a peer notification is + * received, invoke @cb(@cb_data, qp_num). + * @ep_unpublish: Undo @ep_publish. + * @rc_connect: RC-side control plane. Connect to peer-published reso= urces + * via MW @mw_index for @qp_count queue pairs. + * @rc_disconnect: Undo @rc_connect. + * @tx_chans_init: Initialize DMA channels used for data transfer into @= chans. + * @tx_chans_deinit: Tear down DMA channels initialized by @tx_chans_init. + * @notify_peer: Try to notify the peer about updated shared state for + * @qp_num. Return 0 if the peer has been notified (no + * doorbell fallback needed). Return a non-zero value to + * request a doorbell-based fallback. + */ +struct ntb_edma_backend_ops { + int (*match)(struct ntb_dev *ndev); + int (*alloc)(struct ntb_dev *ndev, void **priv); + void (*free)(struct ntb_dev *ndev, void **priv); + + /* Control plane: EP publishes and RC connects */ + int (*ep_publish)(struct ntb_dev *ndev, void *priv, int mw_index, + unsigned int qp_count, + void (*cb)(void *data, int qp_num), void *cb_data); + void (*ep_unpublish)(struct ntb_dev *ndev, void *priv); + int (*rc_connect)(struct ntb_dev *ndev, void *priv, int mw_index, + unsigned int qp_count); + void (*rc_disconnect)(struct ntb_dev *ndev, void *priv); + + /* Data plane: TX channels */ + int (*tx_chans_init)(struct ntb_dev *ndev, void *priv, + struct ntb_edma_chans *chans, bool remote); + void (*tx_chans_deinit)(struct ntb_edma_chans *chans); + int (*notify_peer)(struct ntb_edma_chans *chans, void *priv, + int qp_num); +}; + +struct ntb_edma_backend { + const char *name; + const struct ntb_edma_backend_ops *ops; + struct module *owner; + struct list_head node; +}; + +int ntb_edma_backend_register(struct ntb_edma_backend *be); +void ntb_edma_backend_unregister(struct ntb_edma_backend *be); +const struct ntb_edma_backend *ntb_edma_backend_get(struct ntb_dev *ndev); +void ntb_edma_backend_put(const struct ntb_edma_backend *be); + +#endif /* _NTB_HW_EDMA_BACKEND_H_ */ diff --git a/drivers/ntb/hw/edma/ntb_dw_edma.c b/drivers/ntb/hw/edma/ntb_dw= _edma.c new file mode 100644 index 000000000000..f4c8985889eb --- /dev/null +++ b/drivers/ntb/hw/edma/ntb_dw_edma.c @@ -0,0 +1,977 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) +/* + * NTB remote DesignWare eDMA helpers + * + * This file is a helper library used by the NTB transport remote-eDMA bac= kend, + * not a standalone NTB hardware driver. It contains the DesignWare eDMA + * specific plumbing needed to expose/map peer-accessible resources via an= NTB + * memory window and to manage DMA channels and peer notifications. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "backend.h" + +/* One extra channel is reserved for notification (RC to EP interrupt kick= ). */ +#define NTB_DW_EDMA_TOTAL_CH_NUM (NTB_EDMA_CH_NUM + 1) + +#define NTB_DW_EDMA_INFO_MAGIC 0x45444D41 /* "EDMA" */ +#define NTB_DW_EDMA_NOTIFY_MAX_QP 64 +#define NTB_DW_EDMA_NR_IRQS 4 +#define NTB_DW_EDMA_MW_IDX_INVALID (-1) + +/* Default eDMA LLP memory size */ +#define DMA_LLP_MEM_SIZE PAGE_SIZE + +typedef void (*ntb_edma_interrupt_cb_t)(void *data, int qp_num); + +struct ntb_edma_ctx { + bool initialized; + + /* Fields for the notification handling */ + u32 qp_count; + u32 *notify_src_virt; + dma_addr_t notify_src_phys; + struct scatterlist sgl; + + /* Host-to-EP scratch buffer used to convey event information */ + union { + struct ntb_dw_edma_db *db_virt; + struct ntb_dw_edma_db __iomem *db_io; + }; + dma_addr_t db_phys; + + /* Deterministic mapping for dw-edma .irq_vector callback */ + unsigned int peer_irq_count; + int peer_irq_vec[NTB_DW_EDMA_NR_IRQS]; + + /* For interrupts */ + ntb_edma_interrupt_cb_t cb; + void *cb_data; + + /* Below are the records for teardown path */ + + int mw_index; + bool mw_trans_set; + + /* For ntb_dw_edma_info to be unmapped on teardown */ + struct ntb_dw_edma_info *info_virt; + dma_addr_t info_phys; + size_t info_bytes; + + /* Scratchpad backing for the unused tail of the inbound MW */ + void *mw_pad_virt; + dma_addr_t mw_pad_phys; + size_t mw_pad_bytes; + + /* eDMA register window IOMMU mapping (EP side) */ + bool reg_mapped; + struct iommu_domain *iommu_dom; + unsigned long reg_iova; + size_t reg_iova_size; + + /* Read channels delegated to the host side (EP side) */ + struct dma_chan *dchan[NTB_DW_EDMA_TOTAL_CH_NUM]; + + /* RC-side state */ + bool peer_initialized; + bool peer_probed; + struct dw_edma_chip *peer_chip; + void __iomem *peer_virt; + resource_size_t peer_virt_size; +}; + +struct ntb_dw_edma_info { + u32 magic; + u32 reg_size; + u16 ch_cnt; + u64 db_base; + u64 ll_rd_phys[NTB_DW_EDMA_TOTAL_CH_NUM]; +}; + +struct ntb_dw_edma_db { + u32 target; + u32 db[NTB_DW_EDMA_NOTIFY_MAX_QP]; +}; + +struct ntb_edma_filter { + struct device *dma_dev; + u32 direction; +}; + +static DEFINE_XARRAY(ntb_dw_edma_ctx_xa); +static DEFINE_SPINLOCK(ntb_dw_edma_notify_lock); + +static void ntb_dw_edma_ep_unpublish(struct ntb_dev *ndev, void *priv); + +static int ntb_dw_edma_ctx_register(struct device *dev, struct ntb_edma_ct= x *ctx) +{ + return xa_insert(&ntb_dw_edma_ctx_xa, (unsigned long)dev, ctx, GFP_KERNEL= ); +} + +static void ntb_dw_edma_ctx_unregister(struct device *dev) +{ + xa_erase(&ntb_dw_edma_ctx_xa, (unsigned long)dev); +} + +static struct ntb_edma_ctx *ntb_dw_edma_ctx_lookup(struct device *dev) +{ + return xa_load(&ntb_dw_edma_ctx_xa, (unsigned long)dev); +} + +static bool ntb_dw_edma_filter_fn(struct dma_chan *chan, void *arg) +{ + struct ntb_edma_filter *filter =3D arg; + u32 dir =3D filter->direction; + struct dma_slave_caps caps; + int ret; + + if (chan->device->dev !=3D filter->dma_dev) + return false; + + ret =3D dma_get_slave_caps(chan, &caps); + if (ret < 0) + return false; + + return !!(caps.directions & dir); +} + +static void ntb_dw_edma_notify_cb(struct dma_chan *dchan, void *data) +{ + struct ntb_edma_ctx *ctx =3D data; + ntb_edma_interrupt_cb_t cb; + struct ntb_dw_edma_db *db; + void *cb_data; + u32 qp_count; + u32 i, val; + + guard(spinlock_irqsave)(&ntb_dw_edma_notify_lock); + + cb =3D ctx->cb; + cb_data =3D ctx->cb_data; + qp_count =3D ctx->qp_count; + db =3D ctx->db_virt; + if (!cb || !db) + return; + + for (i =3D 0; i < qp_count; i++) { + val =3D READ_ONCE(db->db[i]); + if (!val) + continue; + + WRITE_ONCE(db->db[i], 0); + cb(cb_data, i); + } +} + +static void ntb_dw_edma_undelegate_chans(struct ntb_edma_ctx *ctx) +{ + unsigned int i; + + if (!ctx) + return; + + scoped_guard(spinlock_irqsave, &ntb_dw_edma_notify_lock) { + ctx->cb =3D NULL; + ctx->cb_data =3D NULL; + } + + for (i =3D 0; i < NTB_DW_EDMA_TOTAL_CH_NUM; i++) { + if (!ctx->dchan[i]) + continue; + + if (i =3D=3D NTB_EDMA_CH_NUM) + dw_edma_chan_register_notify(ctx->dchan[i], NULL, NULL); + + dma_release_channel(ctx->dchan[i]); + ctx->dchan[i] =3D NULL; + } +} + +static int ntb_dw_edma_delegate_chans(struct device *dev, + struct ntb_edma_ctx *ctx, + struct ntb_dw_edma_info *info, + ntb_edma_interrupt_cb_t cb, void *data) +{ + struct ntb_edma_filter filter; + struct dw_edma_region region; + dma_cap_mask_t dma_mask; + struct dma_chan *chan; + unsigned int i; + int rc; + + dma_cap_zero(dma_mask); + dma_cap_set(DMA_SLAVE, dma_mask); + + filter.dma_dev =3D dev; + + /* Configure read channels, which will be driven by the host side */ + for (i =3D 0; i < NTB_DW_EDMA_TOTAL_CH_NUM; i++) { + filter.direction =3D BIT(DMA_DEV_TO_MEM); + chan =3D dma_request_channel(dma_mask, ntb_dw_edma_filter_fn, + &filter); + if (!chan) { + rc =3D -ENODEV; + goto err; + } + ctx->dchan[i] =3D chan; + + if (i =3D=3D NTB_EDMA_CH_NUM) { + scoped_guard(spinlock_irqsave, &ntb_dw_edma_notify_lock) { + ctx->cb =3D cb; + ctx->cb_data =3D data; + } + rc =3D dw_edma_chan_register_notify(chan, + ntb_dw_edma_notify_cb, + ctx); + if (rc) + goto err; + } else { + rc =3D dw_edma_chan_irq_config(chan, DW_EDMA_CH_IRQ_REMOTE); + if (rc) + dev_warn(dev, "irq config failed (i=3D%u %d)\n", + i, rc); + } + + rc =3D dw_edma_chan_get_ll_region(chan, ®ion); + if (rc) + goto err; + + info->ll_rd_phys[i] =3D region.paddr; + } + + return 0; + +err: + ntb_dw_edma_undelegate_chans(ctx); + return rc; +} + +static void ntb_dw_edma_ctx_reset(struct ntb_edma_ctx *ctx) +{ + ctx->initialized =3D false; + ctx->mw_index =3D NTB_DW_EDMA_MW_IDX_INVALID; + ctx->mw_trans_set =3D false; + ctx->reg_mapped =3D false; + ctx->iommu_dom =3D NULL; + ctx->reg_iova =3D 0; + ctx->reg_iova_size =3D 0; + ctx->db_phys =3D 0; + ctx->qp_count =3D 0; + ctx->info_virt =3D NULL; + ctx->info_phys =3D 0; + ctx->info_bytes =3D 0; + ctx->mw_pad_virt =3D NULL; + ctx->mw_pad_phys =3D 0; + ctx->mw_pad_bytes =3D 0; + ctx->db_virt =3D NULL; + memset(ctx->dchan, 0, sizeof(ctx->dchan)); +} + +static int ntb_dw_edma_match(struct ntb_dev *ndev) +{ + struct pci_epc *epc; + phys_addr_t reg_phys; + resource_size_t reg_size; + + /* EP can verify the local DesignWare eDMA presence via epc hook. */ + epc =3D ntb_get_private_data(ndev); + if (epc) { + if (dw_edma_get_reg_window(epc, ®_phys, ®_size)) + return -ENODEV; + return 100; + } + + /* Host cannot validate peer eDMA until link/peer mapping is done. */ + return 50; +} + +static int ntb_dw_edma_alloc(struct ntb_dev *ndev, void **priv) +{ + struct ntb_edma_ctx *ctx; + + ctx =3D devm_kzalloc(&ndev->dev, sizeof(*ctx), GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + *priv =3D ctx; + return 0; +} + +static void ntb_dw_edma_free(struct ntb_dev *ndev, void **priv) +{ + devm_kfree(&ndev->dev, *priv); + *priv =3D NULL; +} + +static int ntb_dw_edma_ep_publish(struct ntb_dev *ndev, void *priv, + int mw_index, unsigned int qp_count, + ntb_edma_interrupt_cb_t cb, void *data) +{ + struct ntb_edma_ctx *ctx =3D priv; + struct ntb_dw_edma_info *info; + struct ntb_dw_edma_db *db; + struct iommu_domain *dom; + struct pci_epc *epc; + struct device *dev; + unsigned int num_subrange =3D NTB_DW_EDMA_TOTAL_CH_NUM + 3; + resource_size_t reg_size, reg_size_mw; + const size_t info_bytes =3D PAGE_SIZE; + dma_addr_t db_phys, info_phys; + phys_addr_t edma_reg_phys; + resource_size_t size_max; + size_t ll_bytes, size; + unsigned int cur =3D 0; + u64 need; + int rc; + u32 i; + + if (ctx->initialized) + return 0; + + /* Clean up stale state from a previous failed attempt. */ + ntb_dw_edma_ep_unpublish(ndev, ctx); + + epc =3D (struct pci_epc *)ntb_get_private_data(ndev); + if (!epc) + return -ENODEV; + dev =3D epc->dev.parent; + + ntb_dw_edma_ctx_reset(ctx); + + ctx->mw_index =3D mw_index; + ctx->qp_count =3D qp_count; + + info =3D dma_alloc_coherent(dev, info_bytes, &info_phys, GFP_KERNEL); + if (!info) + return -ENOMEM; + memset(info, 0, info_bytes); + + ctx->info_virt =3D info; + ctx->info_phys =3D info_phys; + ctx->info_bytes =3D info_bytes; + + /* Get eDMA reg base and size, IOMMU map it if necessary */ + rc =3D dw_edma_get_reg_window(epc, &edma_reg_phys, ®_size); + if (rc) { + dev_err(&ndev->pdev->dev, + "failed to get eDMA register window: %d\n", rc); + goto err; + } + dom =3D iommu_get_domain_for_dev(dev); + if (dom) { + phys_addr_t phys; + unsigned long iova; + + phys =3D edma_reg_phys & PAGE_MASK; + size =3D PAGE_ALIGN(reg_size + edma_reg_phys - phys); + iova =3D phys; + + rc =3D iommu_map(dom, iova, phys, size, + IOMMU_READ | IOMMU_WRITE | IOMMU_MMIO, + GFP_KERNEL); + if (rc) { + dev_err(&ndev->dev, + "failed to direct map eDMA reg: %d\n", rc); + goto err; + } + + ctx->reg_mapped =3D true; + ctx->iommu_dom =3D dom; + ctx->reg_iova =3D iova; + ctx->reg_iova_size =3D size; + } + + /* Read channels are driven by the peer (host side) */ + rc =3D ntb_dw_edma_delegate_chans(dev, ctx, info, cb, data); + if (rc) { + dev_err(&ndev->pdev->dev, + "failed to prepare channels to delegate: %d\n", rc); + goto err; + } + + /* Scratch buffer for notification */ + db =3D dma_alloc_coherent(dev, sizeof(*db), &db_phys, GFP_KERNEL); + if (!db) { + rc =3D -ENOMEM; + goto err; + } + memset(db, 0, sizeof(*db)); + + ctx->db_virt =3D db; + ctx->db_phys =3D db_phys; + + /* Prep works for IB iATU mappings */ + ll_bytes =3D NTB_DW_EDMA_TOTAL_CH_NUM * DMA_LLP_MEM_SIZE; + reg_size_mw =3D roundup_pow_of_two(reg_size); + need =3D info_bytes + PAGE_SIZE + reg_size_mw + ll_bytes; + + rc =3D ntb_mw_get_align(ndev, 0, mw_index, NULL, NULL, &size_max); + if (rc) + goto err; + + if (size_max < need) { + rc =3D -ENOSPC; + goto err; + } + + if (need < size_max) + num_subrange++; + + struct ntb_mw_subrange *r __free(kfree) =3D + kcalloc(num_subrange, sizeof(*r), GFP_KERNEL); + if (!r) { + rc =3D -ENOMEM; + goto err; + } + + ctx->mw_trans_set =3D true; + + /* iATU map ntb_dw_edma_info */ + r[cur].addr =3D info_phys; + r[cur++].size =3D info_bytes; + + /* iATU map ntb_dw_edma_db */ + r[cur].addr =3D db_phys; + r[cur++].size =3D PAGE_SIZE; + + /* iATU map eDMA reg */ + r[cur].addr =3D edma_reg_phys; + r[cur++].size =3D reg_size_mw; + + /* iATU map LL location */ + for (i =3D 0; i < NTB_DW_EDMA_TOTAL_CH_NUM; i++) { + r[cur].addr =3D info->ll_rd_phys[i]; + r[cur++].size =3D DMA_LLP_MEM_SIZE; + } + + /* Padding if needed */ + if (size_max - need > 0) { + resource_size_t pad_bytes =3D size_max - need; + dma_addr_t pad_phys; + void *pad; + + pad =3D dma_alloc_coherent(dev, pad_bytes, &pad_phys, GFP_KERNEL); + if (!pad) { + rc =3D -ENOMEM; + goto err; + } + memset(pad, 0, pad_bytes); + + ctx->mw_pad_virt =3D pad; + ctx->mw_pad_phys =3D pad_phys; + ctx->mw_pad_bytes =3D pad_bytes; + + r[cur].addr =3D pad_phys; + r[cur++].size =3D pad_bytes; + } + + rc =3D ntb_mw_set_trans_ranges(ndev, 0, mw_index, num_subrange, r); + if (rc) + goto err; + + /* Fill in info */ + info->magic =3D NTB_DW_EDMA_INFO_MAGIC; + info->reg_size =3D reg_size_mw; + info->ch_cnt =3D NTB_DW_EDMA_TOTAL_CH_NUM; + info->db_base =3D db_phys; + + ctx->initialized =3D true; + return 0; + +err: + ntb_dw_edma_ep_unpublish(ndev, ctx); + return rc; +} + +static void ntb_dw_edma_peer_irq_reset(struct ntb_edma_ctx *ctx) +{ + ctx->peer_irq_count =3D 0; + memset(ctx->peer_irq_vec, 0xff, sizeof(ctx->peer_irq_vec)); +} + +static int ntb_dw_edma_reserve_peer_irq_vectors(struct pci_dev *pdev, + struct ntb_edma_ctx *ctx, + unsigned int nreq) +{ + int i, found =3D 0; + int irq; + + if (nreq > NTB_DW_EDMA_NR_IRQS) + return -EINVAL; + + ntb_dw_edma_peer_irq_reset(ctx); + + /* NTB driver should have reserved sufficient number of vectors */ + for (i =3D 0; found < nreq; i++) { + irq =3D pci_irq_vector(pdev, i); + if (irq < 0) + break; + if (!irq_has_action(irq)) + ctx->peer_irq_vec[found++] =3D i; + } + if (found < nreq) + return -ENOSPC; + + ctx->peer_irq_count =3D found; + return 0; +} + +static int ntb_dw_edma_irq_vector(struct device *dev, unsigned int nr) +{ + struct ntb_edma_ctx *ctx =3D ntb_dw_edma_ctx_lookup(dev); + struct pci_dev *pdev =3D to_pci_dev(dev); + int vec; + + if (!ctx) + return -EINVAL; + + if (nr >=3D ctx->peer_irq_count) + return -EINVAL; + + vec =3D ctx->peer_irq_vec[nr]; + if (vec < 0) + return -EINVAL; + + return pci_irq_vector(pdev, vec); +} + +static const struct dw_edma_plat_ops ntb_dw_edma_ops =3D { + .irq_vector =3D ntb_dw_edma_irq_vector, +}; + +static void ntb_dw_edma_rc_disconnect(struct ntb_dev *ndev, void *priv) +{ + struct ntb_edma_ctx *ctx =3D priv; + void __iomem *peer_virt =3D ctx->peer_virt; + struct dw_edma_chip *chip =3D ctx->peer_chip; + u32 *notify_src =3D ctx->notify_src_virt; + dma_addr_t notify_src_phys =3D ctx->notify_src_phys; + + /* Stop using peer MMIO early. */ + ctx->db_io =3D NULL; + ctx->db_phys =3D 0; + ctx->qp_count =3D 0; + + if (ctx->peer_probed && chip) + dw_edma_remove(chip); + + ntb_dw_edma_ctx_unregister(&ndev->pdev->dev); + + ntb_dw_edma_peer_irq_reset(ctx); + + ctx->peer_initialized =3D false; + ctx->peer_probed =3D false; + ctx->peer_chip =3D NULL; + + if (notify_src) + dma_free_coherent(&ndev->pdev->dev, sizeof(*notify_src), + notify_src, notify_src_phys); + + ctx->notify_src_virt =3D NULL; + ctx->notify_src_phys =3D 0; + memset(&ctx->sgl, 0, sizeof(ctx->sgl)); + + if (peer_virt) + iounmap(peer_virt); + + ctx->peer_virt =3D NULL; + ctx->peer_virt_size =3D 0; +} + +static int ntb_dw_edma_rc_connect(struct ntb_dev *ndev, void *priv, int mw= _index, + unsigned int qp_count) +{ + struct ntb_edma_ctx *ctx =3D priv; + struct ntb_dw_edma_info __iomem *info; + struct dw_edma_chip *chip; + void __iomem *edma_virt; + resource_size_t mw_size; + phys_addr_t edma_phys; + unsigned int ch_cnt; + unsigned int i; + int ret; + u64 off; + + if (ctx->peer_initialized) + return 0; + + /* Clean up stale state from a previous failed attempt. */ + ntb_dw_edma_rc_disconnect(ndev, priv); + + ret =3D ntb_peer_mw_get_addr(ndev, mw_index, &edma_phys, &mw_size); + if (ret) + return ret; + + edma_virt =3D ioremap(edma_phys, mw_size); + if (!edma_virt) + return -ENOMEM; + + ctx->peer_virt =3D edma_virt; + ctx->peer_virt_size =3D mw_size; + + info =3D edma_virt; + if (readl(&info->magic) !=3D NTB_DW_EDMA_INFO_MAGIC) { + ret =3D -EINVAL; + goto err; + } + + ch_cnt =3D readw(&info->ch_cnt); + if (ch_cnt !=3D NTB_DW_EDMA_TOTAL_CH_NUM) { + ret =3D -EINVAL; + goto err; + } + + chip =3D devm_kzalloc(&ndev->dev, sizeof(*chip), GFP_KERNEL); + if (!chip) { + ret =3D -ENOMEM; + goto err; + } + + ret =3D ntb_dw_edma_ctx_register(&ndev->pdev->dev, ctx); + if (ret) + return ret; + + off =3D 2 * PAGE_SIZE; + chip->dev =3D &ndev->pdev->dev; + chip->nr_irqs =3D NTB_DW_EDMA_NR_IRQS; + chip->ops =3D &ntb_dw_edma_ops; + chip->flags =3D 0; + chip->reg_base =3D edma_virt + off; + chip->mf =3D EDMA_MF_EDMA_UNROLL; + chip->ll_wr_cnt =3D 0; + chip->ll_rd_cnt =3D ch_cnt; + + ctx->db_io =3D (void __iomem *)edma_virt + PAGE_SIZE; + ctx->qp_count =3D qp_count; + ctx->db_phys =3D readq(&info->db_base); + + ctx->notify_src_virt =3D dma_alloc_coherent(&ndev->pdev->dev, + sizeof(*ctx->notify_src_virt), + &ctx->notify_src_phys, + GFP_KERNEL); + if (!ctx->notify_src_virt) { + ret =3D -ENOMEM; + goto err; + } + + off +=3D readl(&info->reg_size); + + for (i =3D 0; i < ch_cnt; i++) { + chip->ll_region_rd[i].vaddr.io =3D edma_virt + off; + chip->ll_region_rd[i].paddr =3D readq(&info->ll_rd_phys[i]); + chip->ll_region_rd[i].sz =3D DMA_LLP_MEM_SIZE; + off +=3D DMA_LLP_MEM_SIZE; + } + + if (!pci_dev_msi_enabled(ndev->pdev)) { + ret =3D -ENXIO; + goto err; + } + ret =3D ntb_dw_edma_reserve_peer_irq_vectors(ndev->pdev, ctx, chip->nr_ir= qs); + if (ret) { + dev_err(&ndev->dev, "no free MSI vectors for remote eDMA: %d\n", + ret); + goto err; + } + + ret =3D dw_edma_probe(chip); + if (ret) { + dev_err(&ndev->dev, "dw_edma_probe failed: %d\n", ret); + ntb_dw_edma_ctx_unregister(&ndev->pdev->dev); + goto err; + } + + ctx->peer_chip =3D chip; + ctx->peer_probed =3D true; + ctx->peer_initialized =3D true; + return 0; + +err: + ntb_dw_edma_rc_disconnect(ndev, ctx); + return ret; +} + +static void ntb_dw_edma_ep_unpublish(struct ntb_dev *ndev, void *priv) +{ + struct ntb_edma_ctx *ctx =3D priv; + struct ntb_dw_edma_info *info; + struct ntb_dw_edma_db *db; + struct device *dev =3D NULL; + struct pci_epc *epc; + dma_addr_t db_phys, info_phys, mw_pad_phys; + size_t info_bytes, mw_pad_bytes; + void *mw_pad; + + epc =3D (struct pci_epc *)ntb_get_private_data(ndev); + WARN_ON(!epc); + if (epc) + dev =3D epc->dev.parent; + + scoped_guard(spinlock_irqsave, &ntb_dw_edma_notify_lock) { + db =3D ctx->db_virt; + db_phys =3D ctx->db_phys; + + /* Make callbacks no-op first. */ + ctx->cb =3D NULL; + ctx->cb_data =3D NULL; + ctx->db_virt =3D NULL; + ctx->qp_count =3D 0; + } + + info =3D ctx->info_virt; + info_phys =3D ctx->info_phys; + info_bytes =3D ctx->info_bytes; + + mw_pad =3D ctx->mw_pad_virt; + mw_pad_phys =3D ctx->mw_pad_phys; + mw_pad_bytes =3D ctx->mw_pad_bytes; + ctx->mw_pad_virt =3D NULL; + ctx->mw_pad_phys =3D 0; + ctx->mw_pad_bytes =3D 0; + + /* Disconnect the MW before freeing its backing memory */ + if (ctx->mw_trans_set && ctx->mw_index !=3D NTB_DW_EDMA_MW_IDX_INVALID) + ntb_mw_clear_trans(ndev, 0, ctx->mw_index); + + ntb_dw_edma_undelegate_chans(ctx); + + if (ctx->reg_mapped) + iommu_unmap(ctx->iommu_dom, ctx->reg_iova, ctx->reg_iova_size); + + if (db && dev) + dma_free_coherent(dev, sizeof(*db), db, db_phys); + + if (info && dev && info_bytes) + dma_free_coherent(dev, info_bytes, info, info_phys); + + if (mw_pad && dev && mw_pad_bytes) + dma_free_coherent(dev, mw_pad_bytes, mw_pad, mw_pad_phys); + + ntb_dw_edma_ctx_reset(ctx); +} + +static void ntb_dw_edma_tx_chans_deinit(struct ntb_edma_chans *edma) +{ + unsigned int i; + + if (!edma) + return; + + for (i =3D 0; i < NTB_EDMA_CH_NUM; i++) { + if (!edma->chan[i]) + continue; + dmaengine_terminate_sync(edma->chan[i]); + dma_release_channel(edma->chan[i]); + edma->chan[i] =3D NULL; + } + edma->num_chans =3D 0; + + if (edma->intr_chan) { + dmaengine_terminate_sync(edma->intr_chan); + dma_release_channel(edma->intr_chan); + edma->intr_chan =3D NULL; + } + + atomic_set(&edma->cur_chan, 0); +} + +static int ntb_dw_edma_setup_intr_chan(struct device *dev, + struct ntb_edma_chans *edma, void *priv) +{ + struct ntb_edma_ctx *ctx =3D priv; + struct ntb_edma_filter filter; + dma_cap_mask_t dma_mask; + struct dma_slave_config cfg; + struct scatterlist *sgl =3D &ctx->sgl; + int rc; + + if (edma->intr_chan) + return 0; + + if (!ctx->notify_src_virt || !ctx->db_phys) + return -EINVAL; + + dma_cap_zero(dma_mask); + dma_cap_set(DMA_SLAVE, dma_mask); + + filter.dma_dev =3D dev; + filter.direction =3D BIT(DMA_MEM_TO_DEV); + + edma->intr_chan =3D dma_request_channel(dma_mask, ntb_dw_edma_filter_fn, + &filter); + if (!edma->intr_chan) { + dev_warn(dev, + "Remote eDMA notify channel could not be allocated\n"); + return -ENODEV; + } + + rc =3D dw_edma_chan_irq_config(edma->intr_chan, DW_EDMA_CH_IRQ_LOCAL); + if (rc) + goto err_release; + + /* Ensure store is visible before kicking DMA transfer */ + wmb(); + + sg_init_table(sgl, 1); + sg_dma_address(sgl) =3D ctx->notify_src_phys; + sg_dma_len(sgl) =3D sizeof(u32); + + memset(&cfg, 0, sizeof(cfg)); + cfg.dst_addr =3D ctx->db_phys; /* The first 32bit is 'target' */ + cfg.src_addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + cfg.dst_addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + cfg.direction =3D DMA_MEM_TO_DEV; + + rc =3D dmaengine_slave_config(edma->intr_chan, &cfg); + if (rc) + goto err_release; + + return 0; + +err_release: + dma_release_channel(edma->intr_chan); + edma->intr_chan =3D NULL; + return rc; +} + +static int ntb_dw_edma_tx_chans_init(struct ntb_dev *ndev, void *priv, + struct ntb_edma_chans *edma, bool remote) +{ + struct device *dev =3D ntb_get_dma_dev(ndev); + struct ntb_edma_filter filter; + dma_cap_mask_t dma_mask; + unsigned int i; + int rc; + + dma_cap_zero(dma_mask); + dma_cap_set(DMA_SLAVE, dma_mask); + + memset(edma, 0, sizeof(*edma)); + edma->dev =3D dev; + + mutex_init(&edma->lock); + + filter.dma_dev =3D dev; + filter.direction =3D BIT(DMA_MEM_TO_DEV); + for (i =3D 0; i < NTB_EDMA_CH_NUM; i++) { + edma->chan[i] =3D dma_request_channel(dma_mask, + ntb_dw_edma_filter_fn, + &filter); + if (!edma->chan[i]) + break; + edma->num_chans++; + + if (remote) + rc =3D dw_edma_chan_irq_config(edma->chan[i], + DW_EDMA_CH_IRQ_REMOTE); + else + rc =3D dw_edma_chan_irq_config(edma->chan[i], + DW_EDMA_CH_IRQ_LOCAL); + + if (rc) { + dev_err(dev, "irq config failed on ch%u: %d\n", i, rc); + goto err; + } + } + + if (!edma->num_chans) { + dev_warn(dev, "Remote eDMA channels failed to initialize\n"); + ntb_dw_edma_tx_chans_deinit(edma); + return -ENODEV; + } + + if (remote) { + rc =3D ntb_dw_edma_setup_intr_chan(dev, edma, priv); + if (rc) + goto err; + } + return 0; +err: + ntb_dw_edma_tx_chans_deinit(edma); + return rc; +} + +static int ntb_dw_edma_notify_peer(struct ntb_edma_chans *edma, void *priv, + int qp_num) +{ + struct ntb_edma_ctx *ctx =3D priv; + struct dma_async_tx_descriptor *txd; + dma_cookie_t cookie; + + if (!edma || !edma->intr_chan) + return -ENXIO; + + if (qp_num < 0 || qp_num >=3D ctx->qp_count) + return -EINVAL; + + if (!ctx->db_io) + return -EINVAL; + + guard(mutex)(&edma->lock); + + writel(1, &ctx->db_io->db[qp_num]); + + /* Ensure store is visible before kicking the DMA transfer */ + wmb(); + + txd =3D dmaengine_prep_slave_sg(edma->intr_chan, &ctx->sgl, 1, + DMA_MEM_TO_DEV, + DMA_CTRL_ACK | DMA_PREP_INTERRUPT); + if (!txd) + return -ENOSPC; + + cookie =3D dmaengine_submit(txd); + if (dma_submit_error(cookie)) + return -ENOSPC; + + dma_async_issue_pending(edma->intr_chan); + return 0; +} + +static const struct ntb_edma_backend_ops ntb_dw_edma_backend_ops =3D { + .match =3D ntb_dw_edma_match, + .alloc =3D ntb_dw_edma_alloc, + .free =3D ntb_dw_edma_free, + + .ep_publish =3D ntb_dw_edma_ep_publish, + .ep_unpublish =3D ntb_dw_edma_ep_unpublish, + .rc_connect =3D ntb_dw_edma_rc_connect, + .rc_disconnect =3D ntb_dw_edma_rc_disconnect, + + .tx_chans_init =3D ntb_dw_edma_tx_chans_init, + .tx_chans_deinit =3D ntb_dw_edma_tx_chans_deinit, + .notify_peer =3D ntb_dw_edma_notify_peer, +}; + +static struct ntb_edma_backend ntb_dw_edma_backend =3D { + .name =3D "dw-edma", + .ops =3D &ntb_dw_edma_backend_ops, + .owner =3D THIS_MODULE, +}; + +static int __init ntb_dw_edma_init(void) +{ + return ntb_edma_backend_register(&ntb_dw_edma_backend); +} +module_init(ntb_dw_edma_init); + +static void __exit ntb_dw_edma_exit(void) +{ + ntb_edma_backend_unregister(&ntb_dw_edma_backend); +} +module_exit(ntb_dw_edma_exit); + +MODULE_DESCRIPTION("NTB DW EPC eDMA backend"); +MODULE_LICENSE("Dual BSD/GPL"); --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021122.outbound.protection.outlook.com [40.107.74.122]) (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 CCE20322C77; Sun, 18 Jan 2026 13:55:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744548; cv=fail; b=kK4QHS5eAAIwENJXHNnEjmPF+LiPaVJXhIAfQba5+w4mUQAKyFjgcrKyTVDyBNWrqRutQQvATIjO2OjZy0peRgr7on2DU+settFNtuNnIKVR6a8JRw45nVYX6ho48NxmNS07Ii1XW3rS3m67nZJCYGp57Dqcu6Spm8iqq9WFYHo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744548; c=relaxed/simple; bh=1Vp0N5ivt9k/MhsXnF9KztQDaveYzVVNm4C3ZVUQHH0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Ivm39IDZsT3zkCp4ZOUfyAZJzuK/Ume77qnbUtSMGkGumrgbAaFz5XEx/P3hM6V/ATS6AVj5Ob1kQpu4Y0XKqkKGE82Akpj1STmANxUDmhKWRgyw0yD9Oxo0BTqiRA/8P0yrvoc6lLbSlHh6wxfx+PVUT09JKeonQ0Vd/2G5B3Q= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=tK6y16Ll; arc=fail smtp.client-ip=40.107.74.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="tK6y16Ll" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ExLfzlcHeHzk7ISf41ac6w7JUzft7GsqoauPtX9TZnn5D3vsD5NyE9AsvTx5qXVNdMpYqBiNNERN/wIXKuxcyrPHaPVON8ZPjbhQ9+EIz5cOsZJFB4ufrQbhVjUnrEJXkIIaUZXRZTsVBn0UDcULYaVmTLoabr86sUmpZsK1Ihd30W/izZOnLI9Jl7sRwZ+bpdf2FvHiN+Cadph24e/OdzurRdVAiSWBnWlY4WVSGBR3HXn9ZGRJVtSAFE+Gw9q8NMa7EYzBhuWLYeII71J6gCqUWjihf+bz0bA2XESymZooiU06tB7Ci7Ff4ZtZNuMa1FKKyOQHG9sy+RmDALOKmg== 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=cqTQGjo05Vsd5AtsyjnzeWcBPuQBXHiCkBn3+2pMBRs=; b=vRvRBORTt4wctP6UWHBs484wsD3BrnllY2sEArTjKhL51azPDgY7qqKDQ10nMWYZBW4SAoFX7wR1fVqYYH1wDhwN7MtJ+F5Br70Okg29iit2vvmlW0L57a297StRAVt06q6vLfEm/jFPg08a5Lt9u5ug66f13afODI9Tu7+kak7MEy0wroxd0rLFrhWbL2O5V8oRcKgKZEZ6AdF1hPJQJTn0detFYf/tNmwVGiqGokzgYIE0Zys3gMXXiFFakS1R47FbV4JnVqmbpZVs1WbaTkUSsH4xiXvUM1W1NIv395kvkvOaQhf/2z6nKZ1gqt+iDhtsqeyfUIC4b14uekoOBA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=cqTQGjo05Vsd5AtsyjnzeWcBPuQBXHiCkBn3+2pMBRs=; b=tK6y16LlyrpuY6/WYOD5FpRnBT74O/Ne3qio2wq4XTfyQXy1iPZrP9d7cO7ncCzEgINthp/JqOLnDoytPLAIYSXOG+70ut4r89vhwV4J+8lFWxAoKHtL6gceUA111hXozJhwkCfkhaIySndx1FUWXaeCR+/2qdCffFkgbCkrE4w= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:13 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:13 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 26/38] NTB: ntb_transport: Add remote embedded-DMA transport client Date: Sun, 18 Jan 2026 22:54:28 +0900 Message-ID: <20260118135440.1958279-27-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0060.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:371::8) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 7afd347e-ecfe-4436-8e09-08de5699341a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?I5g63nyN6o8iVXNBcxZQus4UjkYXSjMGoX54y1yueMKOo1y6stuFDOjmxw3P?= =?us-ascii?Q?zx9pRCjlGhlDAP1JiVFkrmaEO6CwCgF3j+7sjXpRjC7EWrSVd6UZSA+gig9n?= =?us-ascii?Q?7XTnH9jL5cZ+uXC7aMuwXzikMcQa7syc38uyV+Ny9i5q3LWXDatts+pYE10d?= =?us-ascii?Q?sAhBXGv/S5m97S0ZTv4L8FS8dCu6XB7U+IAwzaqMhtN6dTQxj+axJc1QCmah?= =?us-ascii?Q?zo8ARacK7IGk8YUGl6CfaFUzmDMozmsogfl9+/ttmN24q8qsg4iRrgyMBSof?= =?us-ascii?Q?b07mVdh/7rB8GFnoCyDzOIFF1Ax5UF1/xQ4PfIdPH61scIpm4HMzkEU/qsfj?= =?us-ascii?Q?5XAMAjubBVhbKrX1zLpNhw9S4IRPxz3LcUHgANMn6ubEWZ7+VQLlpdcs18Kw?= =?us-ascii?Q?l6pIeUWkWYBkW2J959cAJCKxtQnjfNn3mTrT9fzSz8D+yVDiKean0yQCBh6m?= =?us-ascii?Q?HjOQUBHHfGg5PH6EVC3kBe3jX2dbjdPCJt/E0oEikoQXimnqMp+Uyxd7Yxnn?= =?us-ascii?Q?7e7l7GRsYojji6baxNFFVVYEM6OqepjkSmL+ROu/vgafEcqFOAxpOIFtveKS?= =?us-ascii?Q?dFfFVRREEai+8BvKyLgNbivX6wpQPkxdOe0cTNlUtPMgC73GupHZWV/h50gz?= =?us-ascii?Q?T+mzHPIniPrJuS4w98qDk771k+nnykgAZiVpVRT6lABBJcLRZl7+p2a5HkgA?= =?us-ascii?Q?0afkTyPQvTMQmJTkmbU/N0qd5vykAovcmwJtd9mNBGottTzEZvPsEX8R0p5n?= =?us-ascii?Q?iy8h/mivGhI4OgzvgfgrmMNUMz0WO/nwzjJKiu0G6R8zamlbyKtcvMJ7yTiM?= =?us-ascii?Q?1wC3wkqgmmRPXOlT9JOTyLEh39+FdflO/EgWDoOTr2a8LpkUlzgCNEyl6AmP?= =?us-ascii?Q?a9Wb3ItSeitSQz/ST5FzJ0vWNd+cQ6iSW2NpVXEayoyO0jhXrb4jkK+zwJ2z?= =?us-ascii?Q?9yyEZ+6XBqk0FXyscr9pNmSxTmJMeu2q3XBjcTwYE6iioR+WCYBkJpmSkVxs?= =?us-ascii?Q?zv4wNeJiTR+xHSTROx0kwx4lBCDuaatQfrfw6bxTchoESvks/UGG5xa146xp?= =?us-ascii?Q?Z5Iz0mM57spuNoREs4P/1QxUQMgklO/gJdi0ktEguVWCxG3XmmT+425cujNs?= =?us-ascii?Q?ktw1JjOwDz8wjeWiX4ViVB9pjf12PIhUW0q9jvaofYhSqNfFxyu/WSJ4qp3f?= =?us-ascii?Q?KvCKHX7RYjX913LqIS1+OooQjW1ntD+06GD99wJ0i9SjkDObGctpiiv70Unf?= =?us-ascii?Q?iQQsb86UjyDZPMT4JhvxOKIQOeTihK3u+naJoHTOb2ip3HbtWxXYNuvrVmNj?= =?us-ascii?Q?NXNNXHpjBK3PFjddspDAVN2zsO8bc2+LlI+ku6lMSne5ueUfSh1XyDkEqnyJ?= =?us-ascii?Q?xiYbrvggKkoDIZ4fvtB6S9nQo0pd2bZRdfJOuKr5BRl1yRhxS1ZohTe0urtU?= =?us-ascii?Q?tWhn6+nrBxGF/VwoIZdX8oLQzjItjOsRzNBCo9xR1KrWdutER2nZIVigLH7J?= =?us-ascii?Q?vXcet4nhh9TesM3PeHs5b/crNDVUQQLsHP2HxPFMSZSXzv8rW01U4sgLIhwo?= =?us-ascii?Q?U+JhztvVpespJBCJ4XyB3BRJeigf97Q03Cfv+0M2h1VEeYTHE6Q+gD4RIqDU?= =?us-ascii?Q?lw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?MbNpHV8jbM+2VCQQxI8aWcP+WtEbjaPG79awV/Q/t2F/cVkv0FKoOhM8LTTk?= =?us-ascii?Q?jMPAVYNH3bocQwpBMMe+/LR4MihXpy/4XEy+cAXzH+NiUGjFtQBgDBGsJEIJ?= =?us-ascii?Q?sq10rpDMbdRqhf33u+5O74rFQZez6R2AsC8fn/IewKg8cxayzf2UVkcCden6?= =?us-ascii?Q?2HYP+Wz4xzcHIFb/8WaRwN93B55q8DjP4EohHa4qBKUEDknV4Tz716HCyNSu?= =?us-ascii?Q?RH/pRkCGnctmk1SOUPSNjwXYju9e3J25Ak1fAVJ16SjhBNuvu6kVZMFYmVre?= =?us-ascii?Q?9tmdp/Pv70a5KEzWMKsKtAoG2/oTnjTxyUlY0HYitzMvWRoEYmIsF0/NfVhd?= =?us-ascii?Q?WOQcX9fLU/CQAww0Hv6KyKSTHIbm6aJe1zwI3bqxsWfLNEQge07Avd59zvVu?= =?us-ascii?Q?vPtSKHtAlxmStCnxt523dNuREAshUPEHCSsK2pFRxq21GqDF/Dl+2MxyIkrW?= =?us-ascii?Q?fA4AkWr6B8SjFL8AWaXwLz8FdnssZK8TxUZRCr1mBnBDL0THOFUMP1VwoFKI?= =?us-ascii?Q?DnHJSbKBlc+fRM8O9FtbvMMSWSCBt6wKVUsXdyI7yZadZ+9Z7GsZRC61csl0?= =?us-ascii?Q?W7sbSCCUDi7U+p39BL0O0xWL1QO8v7hLXRtkfOzfllyf+ZSVwOhrCZEVgFUU?= =?us-ascii?Q?r2MNVF2jCbPOxcjRyPHhnHEFtyVKLjhXEbwRV61XCm9kaLFU3VzusH0hynYL?= =?us-ascii?Q?Uftrw2odAN8pyHEWvoudzDlDavht8FxjUsCDSCumIiHKcpEHU6zoPUZj6tO1?= =?us-ascii?Q?bzj0IFExGGUSstsW3zjZU2mSpVLz3etTZVYwKqcZPU8dbdbj63Co0HK/HE0W?= =?us-ascii?Q?EtaCHXnTaPZp9pmVatQVtL+r32MFGaC0398L5u+n+heR0GhqvlsBS5Lf1Tne?= =?us-ascii?Q?2Yf/QhgUroia8Zloso71gHD9uPwuLvNxYIhltYucfKXSEbwAyhKkjOgYOk/s?= =?us-ascii?Q?K2kdd5mDG0UcQGz7j3DOVT6DVFxRqBs0pJLUv8zzpFWHoK2RazMMeh5yB+dR?= =?us-ascii?Q?G+eRRS85pkSmdjmkXkpIUliM7BK9cNE6fK1NOm9AoVrge6ZwWs7GranXjgXi?= =?us-ascii?Q?VBW3Zwi/wLdv00br0owRBnR+kmG07K3pc277cF1/XffmNsBqsdPggWe1LEKo?= =?us-ascii?Q?4z/EuBUMG9SkE433iA4ljEfHxClpdhOeruFuI8zsC1MfDR8roGuPShESRg/X?= =?us-ascii?Q?t9UCDq1NJGYwzbaymzpWni+WS4mclY2e8uKdTzIR9VPAg2/k0Jq4N87Xb2dX?= =?us-ascii?Q?+xqcrnCqYspLPDBuaUcCwStXSml9e5b6BWdmmWO+1iV8n0Chk/Yqd2sE4Z4Z?= =?us-ascii?Q?kmyT+ly8jyHez+Qh8uRMYdQj790XaADte6UaXABOCMPr+hNLaCDz99IIJplx?= =?us-ascii?Q?6oEnuPEtBC8PYaaSsMK9urOuc+55xAVaOoJLXQ5qBG4xstsWLtKu56pf9GfP?= =?us-ascii?Q?lIiA9G7MZaCGN9N2jfitBsqGbo7rqmponiNf41DZGZuDqmrVN/zrH7cc+FMt?= =?us-ascii?Q?8KvZv0B/RYCq8h4JhOo1wb5oKlWsmn8tMxGAzMTxXZyR/XnUwgUisczHtCdD?= =?us-ascii?Q?GDksiCeNENnoYZxD2qMU7liwrnsV+Y3Zh0ufr//Glr+rMBI+TL+M4aMOCaXB?= =?us-ascii?Q?s1LZiDgCC7sCOLXmdB97yp2YLs0QooH6N5qwNmfVmya0OUvFHuMq5T8WVIzm?= =?us-ascii?Q?E6TCmUZs4DfSH/YPUVYhXNlST7AMJXfx46+r64EgKu3om6Klnl/d4alrbVTP?= =?us-ascii?Q?sZyPBEv9Ocuog/RYHpiUmzyWc3tQIMpfUM05t21zQEm9ySIjGPUL?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 7afd347e-ecfe-4436-8e09-08de5699341a X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:13.7884 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: /7eGmEeU8CTivyocAfw3NrIKbopnKEj3p8lrkQCwBGOR8Oz9y8ZYHY1VHC37eGsnr1mYQncdYrs+CEc5eP+v9A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Introduce a new NTB transport client (ntb_client) that uses a PCI endpoint embedded DMA engine to move data between the endpoint and the host. Unlike the existing cpu/dma memcpy-based transport, this transport offloads the data plane to an embedded DMA engine located on the endpoint and driven by the remote host. Control and queue management remain on the peer-exposed memory window, while bulk data movement is performed by the remote embedded DMA engine. This transport requires a different memory window layout from the traditional NTB transport. A key benefit of this client implementation is that the memory window no longer needs to carry data buffers. This makes the design less sensitive to limited memory window space and allows scaling to multiple queue pairs. The transport itself is generic and does not assume a specific vendor's DMA implementation. Support for concrete embedded DMA engines is provided via the ntb_edma backend registry. The initial backend implementation is ntb_dw_edma, which integrates with the DesignWare eDMA driver. This separation allows additional embedded DMA backends to be added in the future without changing the NTB transport core or client logic. Signed-off-by: Koichiro Den --- drivers/ntb/Kconfig | 13 + drivers/ntb/Makefile | 1 + drivers/ntb/ntb_transport_edma.c | 1110 ++++++++++++++++++++++++++++++ 3 files changed, 1124 insertions(+) create mode 100644 drivers/ntb/ntb_transport_edma.c diff --git a/drivers/ntb/Kconfig b/drivers/ntb/Kconfig index df16c755b4da..0dfb89ec290c 100644 --- a/drivers/ntb/Kconfig +++ b/drivers/ntb/Kconfig @@ -37,4 +37,17 @@ config NTB_TRANSPORT =20 If unsure, say N. =20 +config NTB_TRANSPORT_EDMA + tristate "NTB Transport Client on PCI EP embedded DMA" + depends on NTB_TRANSPORT + select NTB_EDMA + help + Enable a transport backend that uses a peer-exposed PCI embedded DMA + engine through a dedicated NTB memory window. + + NOTE: You also need at least one eDMA backend driver enabled/loaded + (e.g. NTB_DW_EDMA) so the transport can find a matching backend. + + If unsure, say N. + endif # NTB diff --git a/drivers/ntb/Makefile b/drivers/ntb/Makefile index 47e6b95ef7ce..7bb952a1cf8f 100644 --- a/drivers/ntb/Makefile +++ b/drivers/ntb/Makefile @@ -2,6 +2,7 @@ obj-$(CONFIG_NTB) +=3D ntb.o hw/ test/ obj-$(CONFIG_NTB_TRANSPORT) +=3D ntb_transport.o obj-$(CONFIG_NTB_TRANSPORT) +=3D ntb_transport_core.o +obj-$(CONFIG_NTB_TRANSPORT_EDMA) +=3D ntb_transport_edma.o =20 ntb-y :=3D core.o ntb-$(CONFIG_NTB_MSI) +=3D msi.o diff --git a/drivers/ntb/ntb_transport_edma.c b/drivers/ntb/ntb_transport_e= dma.c new file mode 100644 index 000000000000..778143a15930 --- /dev/null +++ b/drivers/ntb/ntb_transport_edma.c @@ -0,0 +1,1110 @@ +// SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) +/* + * NTB transport backend for remote embedded DMA (eDMA). + * + * The backend uses an endpoint-exposed embedded DMA engine via an NTB + * memory window. Hardware-specific details are provided by an ntb_edma + * backend driver. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ntb_transport_internal.h" +#include "hw/edma/backend.h" + +static unsigned long max_mw_size; +module_param(max_mw_size, ulong, 0644); +MODULE_PARM_DESC(max_mw_size, "Limit size of large memory windows"); + +static unsigned char max_num_clients; +module_param(max_num_clients, byte, 0644); +MODULE_PARM_DESC(max_num_clients, "Maximum number of NTB transport clients= "); + +#define NTB_EDMA_RING_ORDER 7 +#define NTB_EDMA_RING_ENTRIES BIT(NTB_EDMA_RING_ORDER) +#define NTB_EDMA_RING_MASK (NTB_EDMA_RING_ENTRIES - 1) + +#define NTB_EDMA_MAX_POLL 32 + +/* + * Remote eDMA mode implementation + */ +struct ntb_queue_entry_edma { + dma_addr_t addr; + struct scatterlist sgl; +}; + +struct ntb_transport_ctx_edma { + remote_edma_mode_t remote_edma_mode; + struct device *dma_dev; + struct workqueue_struct *wq; + struct ntb_edma_chans chans; + + const struct ntb_edma_backend *be; + void *be_priv; +}; + +struct ntb_transport_qp_edma { + struct ntb_transport_qp *qp; + + /* + * Schedule peer notification from a sleepable context. + * ntb_peer_db_set() may sleep. + */ + struct work_struct db_work; + + u32 rx_prod; + u32 rx_cons; + u32 tx_cons; + u32 tx_issue; + + spinlock_t rx_lock; + spinlock_t tx_lock; + + struct work_struct rx_work; + struct work_struct tx_work; +}; + +struct ntb_edma_desc { + u32 len; + u32 flags; + u64 addr; /* DMA address */ + u64 data; +}; + +struct ntb_edma_ring { + struct ntb_edma_desc desc[NTB_EDMA_RING_ENTRIES]; + u32 head; + u32 tail; +}; + +static inline bool ntb_qp_edma_is_rc(struct ntb_transport_qp *qp) +{ + struct ntb_transport_ctx_edma *ctx =3D qp->transport->priv; + + return ctx->remote_edma_mode =3D=3D REMOTE_EDMA_RC; +} + +static inline bool ntb_qp_edma_is_ep(struct ntb_transport_qp *qp) +{ + struct ntb_transport_ctx_edma *ctx =3D qp->transport->priv; + + return ctx->remote_edma_mode =3D=3D REMOTE_EDMA_EP; +} + +static inline bool ntb_qp_edma_enabled(struct ntb_transport_qp *qp) +{ + return ntb_qp_edma_is_rc(qp) || ntb_qp_edma_is_ep(qp); +} + +static inline unsigned int ntb_edma_ring_sel(struct ntb_transport_qp *qp, + unsigned int n) +{ + return n ^ !!ntb_qp_edma_is_ep(qp); +} + +static inline struct ntb_edma_ring * +ntb_edma_ring_local(struct ntb_transport_qp *qp, unsigned int n) +{ + unsigned int r =3D ntb_edma_ring_sel(qp, n); + + return &((struct ntb_edma_ring *)qp->rx_buff)[r]; +} + +static inline struct ntb_edma_ring __iomem * +ntb_edma_ring_remote(struct ntb_transport_qp *qp, unsigned int n) +{ + unsigned int r =3D ntb_edma_ring_sel(qp, n); + + return &((struct ntb_edma_ring __iomem *)qp->tx_mw)[r]; +} + +static inline struct ntb_edma_desc * +ntb_edma_desc_local(struct ntb_transport_qp *qp, unsigned int n, unsigned = int i) +{ + return &ntb_edma_ring_local(qp, n)->desc[i]; +} + +static inline struct ntb_edma_desc __iomem * +ntb_edma_desc_remote(struct ntb_transport_qp *qp, unsigned int n, + unsigned int i) +{ + return &ntb_edma_ring_remote(qp, n)->desc[i]; +} + +static inline u32 *ntb_edma_head_local(struct ntb_transport_qp *qp, + unsigned int n) +{ + return &ntb_edma_ring_local(qp, n)->head; +} + +static inline u32 __iomem *ntb_edma_head_remote(struct ntb_transport_qp *q= p, + unsigned int n) +{ + return &ntb_edma_ring_remote(qp, n)->head; +} + +static inline u32 *ntb_edma_tail_local(struct ntb_transport_qp *qp, + unsigned int n) +{ + return &ntb_edma_ring_local(qp, n)->tail; +} + +static inline u32 __iomem *ntb_edma_tail_remote(struct ntb_transport_qp *q= p, + unsigned int n) +{ + return &ntb_edma_ring_remote(qp, n)->tail; +} + +/* The 'i' must be generated by ntb_edma_ring_idx() */ +#define NTB_DESC_TX_O(qp, i) ntb_edma_desc_remote(qp, 0, i) +#define NTB_DESC_TX_I(qp, i) ntb_edma_desc_local(qp, 0, i) +#define NTB_DESC_RX_O(qp, i) ntb_edma_desc_remote(qp, 1, i) +#define NTB_DESC_RX_I(qp, i) ntb_edma_desc_local(qp, 1, i) + +#define NTB_HEAD_TX_I(qp) ntb_edma_head_local(qp, 0) +#define NTB_HEAD_RX_O(qp) ntb_edma_head_remote(qp, 1) + +#define NTB_TAIL_TX_O(qp) ntb_edma_tail_remote(qp, 0) +#define NTB_TAIL_RX_I(qp) ntb_edma_tail_local(qp, 1) + +/* ntb_edma_ring helpers */ +static __always_inline u32 ntb_edma_ring_idx(u32 v) +{ + return v & NTB_EDMA_RING_MASK; +} + +static __always_inline u32 ntb_edma_ring_used_entry(u32 head, u32 tail) +{ + if (head >=3D tail) { + WARN_ON_ONCE((head - tail) > (NTB_EDMA_RING_ENTRIES - 1)); + return head - tail; + } + + WARN_ON_ONCE((U32_MAX - tail + head + 1) > (NTB_EDMA_RING_ENTRIES - 1)); + return U32_MAX - tail + head + 1; +} + +static __always_inline u32 ntb_edma_ring_free_entry(u32 head, u32 tail) +{ + return NTB_EDMA_RING_ENTRIES - ntb_edma_ring_used_entry(head, tail) - 1; +} + +static __always_inline bool ntb_edma_ring_full(u32 head, u32 tail) +{ + return ntb_edma_ring_free_entry(head, tail) =3D=3D 0; +} + +static void *ntb_transport_edma_entry_priv_alloc(void) +{ + return kzalloc(sizeof(struct ntb_queue_entry_edma), GFP_KERNEL); +} + +static void ntb_transport_edma_entry_priv_free(void *priv) +{ + kfree(priv); +} + +static unsigned int ntb_transport_edma_tx_free_entry(struct ntb_transport_= qp *qp) +{ + struct ntb_transport_qp_edma *edma =3D qp->priv; + unsigned int head, tail; + + scoped_guard(spinlock_irqsave, &edma->tx_lock) { + /* In this scope, only 'head' might proceed */ + tail =3D READ_ONCE(edma->tx_issue); + head =3D READ_ONCE(*NTB_HEAD_TX_I(qp)); + } + /* + * 'used' amount indicates how much the other end has refilled, + * which are available for us to use for TX. + */ + return ntb_edma_ring_used_entry(head, tail); +} + +static void ntb_transport_edma_debugfs_stats_show(struct seq_file *s, + struct ntb_transport_qp *qp) +{ + seq_printf(s, "rx_bytes - \t%llu\n", qp->rx_bytes); + seq_printf(s, "rx_pkts - \t%llu\n", qp->rx_pkts); + seq_printf(s, "rx_err_no_buf - %llu\n", qp->rx_err_no_buf); + seq_printf(s, "rx_buff - \t0x%p\n", qp->rx_buff); + seq_printf(s, "rx_max_entry - \t%u\n", qp->rx_max_entry); + seq_printf(s, "rx_alloc_entry - \t%u\n\n", qp->rx_alloc_entry); + + seq_printf(s, "tx_bytes - \t%llu\n", qp->tx_bytes); + seq_printf(s, "tx_pkts - \t%llu\n", qp->tx_pkts); + seq_printf(s, "tx_ring_full - \t%llu\n", qp->tx_ring_full); + seq_printf(s, "tx_err_no_buf - %llu\n", qp->tx_err_no_buf); + seq_printf(s, "tx_mw - \t0x%p\n", qp->tx_mw); + seq_printf(s, "tx_max_entry - \t%u\n", qp->tx_max_entry); + seq_printf(s, "free tx - \t%u\n", ntb_transport_tx_free_entry(qp)); + seq_putc(s, '\n'); + + seq_puts(s, "Using Remote eDMA - Yes\n"); + seq_printf(s, "QP Link - \t%s\n", qp->link_is_up ? "Up" : "Down"); +} + +static void ntb_transport_edma_db_work(struct work_struct *work) +{ + struct ntb_transport_qp_edma *edma =3D + container_of(work, struct ntb_transport_qp_edma, db_work); + struct ntb_transport_qp *qp =3D edma->qp; + + ntb_peer_db_set(qp->ndev, qp->qp_bit); +} + +static void ntb_transport_edma_notify_peer(struct ntb_transport_qp_edma *e= dma) +{ + struct ntb_transport_qp *qp =3D edma->qp; + struct ntb_transport_ctx_edma *ctx =3D qp->transport->priv; + + if (!ctx->be->ops->notify_peer(&ctx->chans, ctx->be_priv, qp->qp_num)) + return; + + /* + * Called from contexts that may be atomic. Since ntb_peer_db_set() + * may sleep, delegate the actual doorbell write to a workqueue. + */ + queue_work(system_highpri_wq, &edma->db_work); +} + +static void ntb_transport_edma_isr(void *data, int qp_num) +{ + struct ntb_transport_ctx *nt =3D data; + struct ntb_transport_qp_edma *edma; + struct ntb_transport_ctx_edma *ctx; + struct ntb_transport_qp *qp; + + if (qp_num < 0 || qp_num >=3D nt->qp_count) + return; + + qp =3D &nt->qp_vec[qp_num]; + if (WARN_ON(!qp)) + return; + + ctx =3D (struct ntb_transport_ctx_edma *)qp->transport->priv; + edma =3D qp->priv; + if (!edma || !ctx) + return; + + queue_work(ctx->wq, &edma->rx_work); + queue_work(ctx->wq, &edma->tx_work); +} + +static int ntb_transport_edma_rc_init(struct ntb_transport_ctx *nt) +{ + struct ntb_transport_ctx_edma *ctx =3D nt->priv; + struct ntb_dev *ndev =3D nt->ndev; + struct pci_dev *pdev =3D ndev->pdev; + int peer_mw; + int rc; + + if (ctx->remote_edma_mode !=3D REMOTE_EDMA_UNKNOWN) + return 0; + + peer_mw =3D ntb_peer_mw_count(ndev); + if (peer_mw <=3D 0) + return -ENODEV; + + rc =3D ctx->be->ops->rc_connect(ndev, ctx->be_priv, peer_mw - 1, nt->qp_c= ount); + if (rc) { + dev_err(&pdev->dev, "Failed to enable remote eDMA: %d\n", rc); + return rc; + } + + rc =3D ctx->be->ops->tx_chans_init(ndev, ctx->be_priv, &ctx->chans, true); + if (rc) { + dev_err(&pdev->dev, "Failed to setup eDMA channels: %d\n", rc); + goto err_rc_disconnect; + } + + ctx->remote_edma_mode =3D REMOTE_EDMA_RC; + return 0; + +err_rc_disconnect: + ctx->be->ops->rc_disconnect(ndev, ctx->be_priv); + return rc; +} + +static void ntb_transport_edma_rc_deinit(struct ntb_transport_ctx *nt) +{ + struct ntb_transport_ctx_edma *ctx =3D nt->priv; + struct ntb_dev *ndev =3D nt->ndev; + + if (ctx->remote_edma_mode !=3D REMOTE_EDMA_RC) + return; + + ctx->be->ops->tx_chans_deinit(&ctx->chans); + ctx->be->ops->rc_disconnect(ndev, ctx->be_priv); + + ctx->remote_edma_mode =3D REMOTE_EDMA_UNKNOWN; +} + +static int ntb_transport_edma_ep_init(struct ntb_transport_ctx *nt) +{ + struct ntb_transport_ctx_edma *ctx =3D nt->priv; + struct ntb_dev *ndev =3D nt->ndev; + struct pci_dev *pdev =3D ndev->pdev; + int peer_mw; + int rc; + + if (ctx->remote_edma_mode !=3D REMOTE_EDMA_UNKNOWN) + return 0; + + /* + * This check assumes that the endpoint (pci-epf-vntb.c) + * ntb_dev_ops implements .get_private_data() while the host side + * (ntb_hw_epf.c) does not. + */ + if (!ntb_get_private_data(ndev)) + return 0; + + peer_mw =3D ntb_peer_mw_count(ndev); + if (peer_mw <=3D 0) + return -ENODEV; + + rc =3D ctx->be->ops->ep_publish(ndev, ctx->be_priv, peer_mw - 1, nt->qp_c= ount, + ntb_transport_edma_isr, nt); + if (rc) { + dev_err(&pdev->dev, + "Failed to set up memory window for eDMA: %d\n", rc); + return rc; + } + + rc =3D ctx->be->ops->tx_chans_init(ndev, ctx->be_priv, &ctx->chans, false= ); + if (rc) { + dev_err(&pdev->dev, "Failed to setup eDMA channels: %d\n", rc); + ctx->be->ops->ep_unpublish(ndev, ctx->be_priv); + return rc; + } + + ctx->remote_edma_mode =3D REMOTE_EDMA_EP; + return 0; +} + +static void ntb_transport_edma_ep_deinit(struct ntb_transport_ctx *nt) +{ + struct ntb_transport_ctx_edma *ctx =3D nt->priv; + struct ntb_dev *ndev =3D nt->ndev; + + if (ctx->remote_edma_mode !=3D REMOTE_EDMA_EP) + return; + + ctx->be->ops->tx_chans_deinit(&ctx->chans); + ctx->be->ops->ep_unpublish(ndev, ctx->be_priv); + + ctx->remote_edma_mode =3D REMOTE_EDMA_UNKNOWN; +} + +static int ntb_transport_edma_setup_qp_mw(struct ntb_transport_ctx *nt, + unsigned int qp_num) +{ + struct ntb_transport_qp *qp =3D &nt->qp_vec[qp_num]; + struct ntb_dev *ndev =3D nt->ndev; + struct ntb_queue_entry *entry; + struct ntb_transport_mw *mw; + unsigned int mw_num, mw_count, qp_count; + unsigned int qp_offset, rx_info_offset; + unsigned int mw_size, mw_size_per_qp; + unsigned int num_qps_mw; + size_t edma_total; + unsigned int i; + int node; + + mw_count =3D nt->mw_count; + qp_count =3D nt->qp_count; + + mw_num =3D QP_TO_MW(nt, qp_num); + mw =3D &nt->mw_vec[mw_num]; + + if (!mw->virt_addr) + return -ENOMEM; + + if (mw_num < qp_count % mw_count) + num_qps_mw =3D qp_count / mw_count + 1; + else + num_qps_mw =3D qp_count / mw_count; + + mw_size =3D min(nt->mw_vec[mw_num].phys_size, mw->xlat_size); + if (max_mw_size && mw_size > max_mw_size) + mw_size =3D max_mw_size; + + mw_size_per_qp =3D round_down((unsigned int)mw_size / num_qps_mw, SZ_64); + qp_offset =3D mw_size_per_qp * (qp_num / mw_count); + rx_info_offset =3D mw_size_per_qp - sizeof(struct ntb_rx_info); + + qp->tx_mw_size =3D mw_size_per_qp; + qp->tx_mw =3D nt->mw_vec[mw_num].vbase + qp_offset; + if (!qp->tx_mw) + return -EINVAL; + qp->tx_mw_phys =3D nt->mw_vec[mw_num].phys_addr + qp_offset; + if (!qp->tx_mw_phys) + return -EINVAL; + qp->rx_info =3D qp->tx_mw + rx_info_offset; + qp->rx_buff =3D mw->virt_addr + qp_offset; + qp->remote_rx_info =3D qp->rx_buff + rx_info_offset; + + /* Due to housekeeping, there must be at least 2 buffs */ + qp->tx_max_frame =3D min(nt->transport_mtu, mw_size_per_qp / 2); + qp->rx_max_frame =3D min(nt->transport_mtu, mw_size_per_qp / 2); + + /* In eDMA mode, decouple from MW sizing and force ring-sized entries */ + edma_total =3D 2 * sizeof(struct ntb_edma_ring); + if (rx_info_offset < edma_total) { + dev_err(&ndev->dev, "Ring space requires %zuB (>=3D%uB)\n", + edma_total, rx_info_offset); + return -EINVAL; + } + qp->tx_max_entry =3D NTB_EDMA_RING_ENTRIES; + qp->rx_max_entry =3D NTB_EDMA_RING_ENTRIES; + + /* + * Checking to see if we have more entries than the default. + * We should add additional entries if that is the case so we + * can be in sync with the transport frames. + */ + node =3D dev_to_node(&ndev->dev); + for (i =3D qp->rx_alloc_entry; i < qp->rx_max_entry; i++) { + entry =3D ntb_queue_entry_alloc(nt, qp, node); + if (!entry) + return -ENOMEM; + + entry->qp =3D qp; + ntb_list_add(&qp->ntb_rx_q_lock, &entry->entry, + &qp->rx_free_q); + qp->rx_alloc_entry++; + } + + memset(qp->rx_buff, 0, edma_total); + + qp->rx_pkts =3D 0; + qp->tx_pkts =3D 0; + + return 0; +} + +static int ntb_transport_edma_rx_complete(struct ntb_transport_qp *qp) +{ + struct device *dma_dev =3D ntb_get_dma_dev(qp->ndev); + struct ntb_transport_qp_edma *edma =3D qp->priv; + struct ntb_queue_entry_edma *e; + struct ntb_queue_entry *entry; + struct ntb_edma_desc *in; + unsigned int len; + bool link_down; + u32 idx; + + if (ntb_edma_ring_used_entry(READ_ONCE(*NTB_TAIL_RX_I(qp)), + edma->rx_cons) =3D=3D 0) + return 0; + + idx =3D ntb_edma_ring_idx(edma->rx_cons); + in =3D NTB_DESC_RX_I(qp, idx); + if (!(in->flags & DESC_DONE_FLAG)) + return 0; + + link_down =3D in->flags & LINK_DOWN_FLAG; + in->flags =3D 0; + len =3D in->len; /* might be smaller than entry->len */ + + entry =3D (struct ntb_queue_entry *)(uintptr_t)in->data; + if (WARN_ON(!entry)) + return 0; + + e =3D entry->priv; + dma_unmap_single(dma_dev, e->addr, entry->len, DMA_FROM_DEVICE); + + if (link_down) { + ntb_qp_link_down(qp); + edma->rx_cons++; + ntb_list_add(&qp->ntb_rx_q_lock, &entry->entry, &qp->rx_free_q); + return 1; + } + + qp->rx_bytes +=3D len; + qp->rx_pkts++; + edma->rx_cons++; + + if (qp->rx_handler && qp->client_ready) + qp->rx_handler(qp, qp->cb_data, entry->cb_data, len); + + ntb_list_add(&qp->ntb_rx_q_lock, &entry->entry, &qp->rx_free_q); + return 1; +} + +static void ntb_transport_edma_rx_work(struct work_struct *work) +{ + struct ntb_transport_qp_edma *edma =3D + container_of(work, struct ntb_transport_qp_edma, rx_work); + struct ntb_transport_qp *qp =3D edma->qp; + struct ntb_transport_ctx_edma *ctx =3D qp->transport->priv; + unsigned int i; + + for (i =3D 0; i < NTB_EDMA_MAX_POLL; i++) { + if (!ntb_transport_edma_rx_complete(qp)) + break; + } + + if (ntb_transport_edma_rx_complete(qp)) + queue_work(ctx->wq, &edma->rx_work); +} + +static void ntb_transport_edma_tx_work(struct work_struct *work) +{ + struct ntb_transport_qp_edma *edma =3D + container_of(work, struct ntb_transport_qp_edma, tx_work); + struct ntb_transport_qp *qp =3D edma->qp; + struct ntb_edma_desc *in, __iomem *out; + struct ntb_queue_entry *entry; + void *cb_data; + int len; + u32 idx; + + while (ntb_edma_ring_used_entry(READ_ONCE(edma->tx_issue), + edma->tx_cons) !=3D 0) { + /* Paired with smp_wmb() in ntb_transport_edma_tx_enqueue_inner() */ + smp_rmb(); + + idx =3D ntb_edma_ring_idx(edma->tx_cons); + in =3D NTB_DESC_TX_I(qp, idx); + entry =3D (struct ntb_queue_entry *)(uintptr_t)in->data; + if (!entry || !(entry->flags & DESC_DONE_FLAG)) + break; + + in->data =3D 0; + + cb_data =3D entry->cb_data; + len =3D entry->len; + + out =3D NTB_DESC_TX_O(qp, idx); + + WRITE_ONCE(edma->tx_cons, edma->tx_cons + 1); + + iowrite32(entry->flags, &out->flags); + iowrite32(edma->tx_cons, NTB_TAIL_TX_O(qp)); + + ntb_transport_edma_notify_peer(edma); + + ntb_list_add(&qp->ntb_tx_free_q_lock, &entry->entry, + &qp->tx_free_q); + + if (qp->tx_handler) + qp->tx_handler(qp, qp->cb_data, cb_data, len); + + if (len < 0) + continue; + + /* stat updates */ + qp->tx_bytes +=3D len; + qp->tx_pkts++; + } +} + +static void ntb_transport_edma_tx_cb(void *data, + const struct dmaengine_result *res) +{ + struct ntb_queue_entry *entry =3D data; + struct ntb_transport_qp *qp =3D entry->qp; + struct ntb_queue_entry_edma *e =3D entry->priv; + struct ntb_transport_ctx *nt =3D qp->transport; + struct device *dma_dev =3D ntb_get_dma_dev(qp->ndev); + enum dmaengine_tx_result dma_err =3D res->result; + struct ntb_transport_ctx_edma *ctx =3D nt->priv; + struct ntb_transport_qp_edma *edma =3D qp->priv; + + switch (dma_err) { + case DMA_TRANS_READ_FAILED: + case DMA_TRANS_WRITE_FAILED: + case DMA_TRANS_ABORTED: + entry->errors++; + entry->len =3D -EIO; + break; + case DMA_TRANS_NOERROR: + default: + break; + } + dma_unmap_sg(dma_dev, &e->sgl, 1, DMA_TO_DEVICE); + sg_dma_address(&e->sgl) =3D 0; + + entry->flags |=3D DESC_DONE_FLAG; + + queue_work(ctx->wq, &edma->tx_work); +} + +static int ntb_transport_edma_submit(struct device *d, struct dma_chan *ch= an, + size_t len, void *rc_src, dma_addr_t dst, + struct ntb_queue_entry *entry) +{ + struct ntb_queue_entry_edma *e =3D entry->priv; + struct dma_async_tx_descriptor *txd; + struct scatterlist *sgl =3D &e->sgl; + struct dma_slave_config cfg; + dma_cookie_t cookie; + int nents, rc; + + if (!d) + return -ENODEV; + + if (!chan) + return -ENXIO; + + if (WARN_ON(!rc_src || !dst)) + return -EINVAL; + + if (WARN_ON(sg_dma_address(sgl))) + return -EINVAL; + + sg_init_one(sgl, rc_src, len); + nents =3D dma_map_sg(d, sgl, 1, DMA_TO_DEVICE); + if (nents <=3D 0) + return -EIO; + + memset(&cfg, 0, sizeof(cfg)); + cfg.dst_addr =3D dst; + cfg.src_addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + cfg.dst_addr_width =3D DMA_SLAVE_BUSWIDTH_4_BYTES; + cfg.direction =3D DMA_MEM_TO_DEV; + + txd =3D dmaengine_prep_config_sg(chan, sgl, 1, DMA_MEM_TO_DEV, + DMA_CTRL_ACK | DMA_PREP_INTERRUPT, &cfg); + if (!txd) { + rc =3D -EIO; + goto out_unmap; + } + + txd->callback_result =3D ntb_transport_edma_tx_cb; + txd->callback_param =3D entry; + + cookie =3D dmaengine_submit(txd); + if (dma_submit_error(cookie)) { + rc =3D -EIO; + goto out_unmap; + } + dma_async_issue_pending(chan); + return 0; +out_unmap: + dma_unmap_sg(d, sgl, 1, DMA_TO_DEVICE); + return rc; +} + +static struct dma_chan *ntb_transport_edma_pick_chan(struct ntb_edma_chans= *chans, + unsigned int idx) +{ + return chans->chan[idx % chans->num_chans]; +} + +static int ntb_transport_edma_tx_enqueue_inner(struct ntb_transport_qp *qp, + struct ntb_queue_entry *entry) +{ + struct device *dma_dev =3D ntb_get_dma_dev(qp->ndev); + struct ntb_transport_qp_edma *edma =3D qp->priv; + struct ntb_transport_ctx *nt =3D qp->transport; + struct ntb_edma_desc *in, __iomem *out; + struct ntb_transport_ctx_edma *ctx =3D nt->priv; + unsigned int len =3D entry->len; + struct dma_chan *chan; + u32 issue, idx, head; + dma_addr_t dst; + int rc; + + WARN_ON_ONCE(entry->flags & DESC_DONE_FLAG); + + scoped_guard(spinlock_irqsave, &edma->tx_lock) { + head =3D READ_ONCE(*NTB_HEAD_TX_I(qp)); + issue =3D edma->tx_issue; + if (ntb_edma_ring_used_entry(head, issue) =3D=3D 0) { + qp->tx_ring_full++; + return -ENOSPC; + } + + /* + * ntb_transport_edma_tx_work() checks entry->flags + * so it needs to be set before tx_issue++. + */ + idx =3D ntb_edma_ring_idx(issue); + in =3D NTB_DESC_TX_I(qp, idx); + in->data =3D (uintptr_t)entry; + + /* Make in->data visible before tx_issue++ */ + smp_wmb(); + + WRITE_ONCE(edma->tx_issue, edma->tx_issue + 1); + } + + /* Publish the final transfer length to the other end */ + out =3D NTB_DESC_TX_O(qp, idx); + iowrite32(len, &out->len); + ioread32(&out->len); + + if (unlikely(!len)) { + entry->flags |=3D DESC_DONE_FLAG; + queue_work(ctx->wq, &edma->tx_work); + return 0; + } + + /* Paired with dma_wmb() in ntb_transport_edma_rx_enqueue_inner() */ + dma_rmb(); + + /* kick remote eDMA read transfer */ + dst =3D (dma_addr_t)in->addr; + chan =3D ntb_transport_edma_pick_chan(&ctx->chans, qp->qp_num); + rc =3D ntb_transport_edma_submit(dma_dev, chan, len, entry->buf, dst, + entry); + if (rc) { + entry->errors++; + entry->len =3D -EIO; + entry->flags |=3D DESC_DONE_FLAG; + queue_work(ctx->wq, &edma->tx_work); + } + return 0; +} + +static int ntb_transport_edma_tx_enqueue(struct ntb_transport_qp *qp, + struct ntb_queue_entry *entry, + void *cb, void *data, unsigned int len, + unsigned int flags) +{ + struct ntb_queue_entry_edma *e =3D entry->priv; + struct device *dma_dev; + + if (e->addr) { + /* Deferred unmap */ + dma_dev =3D ntb_get_dma_dev(qp->ndev); + dma_unmap_single(dma_dev, e->addr, entry->len, + DMA_TO_DEVICE); + } + + entry->cb_data =3D cb; + entry->buf =3D data; + entry->len =3D len; + entry->flags =3D flags; + entry->errors =3D 0; + + e->addr =3D 0; + + WARN_ON_ONCE(!ntb_qp_edma_enabled(qp)); + + return ntb_transport_edma_tx_enqueue_inner(qp, entry); +} + +static int ntb_transport_edma_rx_enqueue_inner(struct ntb_transport_qp *qp, + struct ntb_queue_entry *entry) +{ + struct device *dma_dev =3D ntb_get_dma_dev(qp->ndev); + struct ntb_transport_qp_edma *edma =3D qp->priv; + struct ntb_queue_entry_edma *e =3D entry->priv; + struct ntb_edma_desc *in, __iomem *out; + unsigned int len =3D entry->len; + void *data =3D entry->buf; + dma_addr_t dst; + u32 idx; + int rc; + + dst =3D dma_map_single(dma_dev, data, len, DMA_FROM_DEVICE); + rc =3D dma_mapping_error(dma_dev, dst); + if (rc) + return rc; + + guard(spinlock_bh)(&edma->rx_lock); + + if (ntb_edma_ring_full(READ_ONCE(edma->rx_prod), + READ_ONCE(edma->rx_cons))) { + rc =3D -ENOSPC; + goto out_unmap; + } + + idx =3D ntb_edma_ring_idx(edma->rx_prod); + in =3D NTB_DESC_RX_I(qp, idx); + out =3D NTB_DESC_RX_O(qp, idx); + + iowrite32(len, &out->len); + iowrite64(dst, &out->addr); + + WARN_ON(in->flags & DESC_DONE_FLAG); + in->data =3D (uintptr_t)entry; + e->addr =3D dst; + + /* Ensure len/addr are visible before the head update */ + dma_wmb(); + + WRITE_ONCE(edma->rx_prod, edma->rx_prod + 1); + iowrite32(edma->rx_prod, NTB_HEAD_RX_O(qp)); + + return 0; +out_unmap: + dma_unmap_single(dma_dev, dst, len, DMA_FROM_DEVICE); + return rc; +} + +static int ntb_transport_edma_rx_enqueue(struct ntb_transport_qp *qp, + struct ntb_queue_entry *entry) +{ + int rc; + + rc =3D ntb_transport_edma_rx_enqueue_inner(qp, entry); + if (rc) { + ntb_list_add(&qp->ntb_rx_q_lock, &entry->entry, + &qp->rx_free_q); + return rc; + } + + if (qp->active) + tasklet_schedule(&qp->rxc_db_work); + + return 0; +} + +static void ntb_transport_edma_rx_poll(struct ntb_transport_qp *qp) +{ + struct ntb_transport_ctx *nt =3D qp->transport; + struct ntb_transport_ctx_edma *ctx =3D nt->priv; + struct ntb_transport_qp_edma *edma =3D qp->priv; + + queue_work(ctx->wq, &edma->rx_work); + queue_work(ctx->wq, &edma->tx_work); +} + +static int ntb_transport_edma_qp_init(struct ntb_transport_ctx *nt, + unsigned int qp_num) +{ + struct ntb_transport_qp *qp =3D &nt->qp_vec[qp_num]; + struct ntb_transport_qp_edma *edma; + struct ntb_dev *ndev =3D nt->ndev; + int node; + + node =3D dev_to_node(&ndev->dev); + + qp->priv =3D kzalloc_node(sizeof(*edma), GFP_KERNEL, node); + if (!qp->priv) + return -ENOMEM; + + edma =3D (struct ntb_transport_qp_edma *)qp->priv; + edma->qp =3D qp; + edma->rx_prod =3D 0; + edma->rx_cons =3D 0; + edma->tx_cons =3D 0; + edma->tx_issue =3D 0; + + spin_lock_init(&edma->rx_lock); + spin_lock_init(&edma->tx_lock); + + INIT_WORK(&edma->db_work, ntb_transport_edma_db_work); + INIT_WORK(&edma->rx_work, ntb_transport_edma_rx_work); + INIT_WORK(&edma->tx_work, ntb_transport_edma_tx_work); + + return 0; +} + +static void ntb_transport_edma_qp_free(struct ntb_transport_qp *qp) +{ + struct ntb_transport_qp_edma *edma =3D qp->priv; + + disable_work_sync(&edma->db_work); + disable_work_sync(&edma->rx_work); + disable_work_sync(&edma->tx_work); + + kfree(qp->priv); + qp->priv =3D NULL; +} + +static int ntb_transport_edma_link_up_pre(struct ntb_transport_ctx *nt) +{ + struct ntb_dev *ndev =3D nt->ndev; + struct pci_dev *pdev =3D ndev->pdev; + int rc; + + rc =3D ntb_transport_edma_ep_init(nt); + if (rc) + dev_err(&pdev->dev, "Failed to init EP: %d\n", rc); + + return rc; +} + +static int ntb_transport_edma_link_up_post(struct ntb_transport_ctx *nt) +{ + struct ntb_dev *ndev =3D nt->ndev; + struct pci_dev *pdev =3D ndev->pdev; + int rc; + + rc =3D ntb_transport_edma_rc_init(nt); + if (rc) + dev_err(&pdev->dev, "Failed to init RC: %d\n", rc); + + return rc; +} + +static void ntb_transport_edma_link_down(struct ntb_transport_ctx *nt) +{ + struct ntb_transport_ctx_edma *ctx =3D nt->priv; + + WARN_ON_ONCE(!ctx); + switch (ctx->remote_edma_mode) { + case REMOTE_EDMA_EP: + ntb_transport_edma_ep_deinit(nt); + break; + case REMOTE_EDMA_RC: + ntb_transport_edma_rc_deinit(nt); + break; + default: + } +} + +static void ntb_transport_edma_disable(struct ntb_transport_ctx *nt) +{ + struct ntb_transport_ctx_edma *ctx =3D nt->priv; + struct ntb_dev *ndev =3D nt->ndev; + + if (!ctx) + return; + + if (ctx->wq) + destroy_workqueue(ctx->wq); + if (ctx->be_priv) + ctx->be->ops->free(ndev, &ctx->be_priv); + if (ctx->be) + ntb_edma_backend_put(ctx->be); + + kfree(ctx); + nt->priv =3D NULL; +} + +static int ntb_transport_edma_enable(struct ntb_transport_ctx *nt, + unsigned int *mw_count) +{ + struct ntb_transport_ctx_edma *ctx; + struct ntb_dev *ndev =3D nt->ndev; + int node; + int ret; + + node =3D dev_to_node(&ndev->dev); + ctx =3D kzalloc_node(sizeof(*ctx), GFP_KERNEL, node); + if (!ctx) + return -ENOMEM; + + nt->priv =3D ctx; + ctx->be =3D ntb_edma_backend_get(ndev); + if (!ctx->be) { + dev_err(&ndev->dev, "No suitable eDMA backend found\n"); + ret =3D -ENODEV; + goto err; + } + dev_info(&ndev->dev, "Selected eDMA backend: %s\n", ctx->be->name); + + ret =3D ctx->be->ops->alloc(ndev, &ctx->be_priv); + if (ret) + goto err; + + /* + * We need at least one MW for the transport plus one MW reserved + * for the remote eDMA window (see ntb_edma_setup_mws/peer). + */ + if (*mw_count <=3D 1) { + dev_err(&ndev->dev, + "remote eDMA requires at least two MWS (have %u)\n", + *mw_count); + kfree(ctx->be_priv); + ret =3D -ENODEV; + goto err; + } + + ctx->wq =3D alloc_workqueue("ntb-edma-wq", WQ_UNBOUND | WQ_SYSFS, 0); + if (!ctx->wq) { + kfree(ctx->be_priv); + ntb_transport_edma_disable(nt); + ret =3D -ENOMEM; + goto err; + } + + /* Reserve the last peer MW exclusively for the eDMA window. */ + *mw_count -=3D 1; + + return 0; +err: + ntb_transport_edma_disable(nt); + return ret; +} + +static const struct ntb_transport_backend_ops edma_transport_ops =3D { + .enable =3D ntb_transport_edma_enable, + .disable =3D ntb_transport_edma_disable, + .qp_init =3D ntb_transport_edma_qp_init, + .qp_free =3D ntb_transport_edma_qp_free, + .link_up_pre =3D ntb_transport_edma_link_up_pre, + .link_up_post =3D ntb_transport_edma_link_up_post, + .link_down =3D ntb_transport_edma_link_down, + .setup_qp_mw =3D ntb_transport_edma_setup_qp_mw, + .entry_priv_alloc =3D ntb_transport_edma_entry_priv_alloc, + .entry_priv_free =3D ntb_transport_edma_entry_priv_free, + .tx_free_entry =3D ntb_transport_edma_tx_free_entry, + .tx_enqueue =3D ntb_transport_edma_tx_enqueue, + .rx_enqueue =3D ntb_transport_edma_rx_enqueue, + .rx_poll =3D ntb_transport_edma_rx_poll, + .debugfs_stats_show =3D ntb_transport_edma_debugfs_stats_show, +}; + +static struct ntb_transport_backend ntb_edma_transport_backend =3D { + .name =3D "edma", + .ops =3D &edma_transport_ops, + .owner =3D THIS_MODULE, +}; + +static int ntb_transport_edma_client_probe(struct ntb_client *self, + struct ntb_dev *ndev) +{ + return ntb_transport_attach(ndev, "edma", false, max_mw_size, 0xffff, + max_num_clients, 0, false, + NTB_EDMA_RING_ENTRIES); +} + +static void ntb_transport_edma_client_remove(struct ntb_client *self, + struct ntb_dev *ndev) +{ + ntb_transport_detach(ndev); +} + +static struct ntb_client ntb_transport_edma_client =3D { + .ops =3D { + .probe =3D ntb_transport_edma_client_probe, + .remove =3D ntb_transport_edma_client_remove, + }, +}; + +static int __init ntb_transport_edma_init(void) +{ + int rc; + + rc =3D ntb_transport_backend_register(&ntb_edma_transport_backend); + if (rc) + return rc; + + rc =3D ntb_register_client(&ntb_transport_edma_client); + if (rc) + ntb_transport_backend_unregister(&ntb_edma_transport_backend); + + return rc; +} +module_init(ntb_transport_edma_init); + +static void ntb_transport_edma_exit(void) +{ + ntb_unregister_client(&ntb_transport_edma_client); + ntb_transport_backend_unregister(&ntb_edma_transport_backend); +} +module_exit(ntb_transport_edma_exit); + +MODULE_DESCRIPTION("NTB transport backend for remote PCI embedded DMA"); +MODULE_LICENSE("Dual BSD/GPL"); --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020105.outbound.protection.outlook.com [52.101.229.105]) (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 9573F346AE6; Sun, 18 Jan 2026 13:55:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744552; cv=fail; b=ZcUSj77oj+rurU9SdBy+h6zqQiWmGyoeL09BAhSvMnZ688fRGE40MjlK8TS32CJcKpinamcDrrzPNqokXlgOQceH6Gp0/xGGCbcTiypOXeIRkdY3T+piZJNOp2Xq9XRrc2fLKM6mVgiYeXvjWF5AYNM4ARUzqKUEwWfn2tGwjxo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744552; c=relaxed/simple; bh=vT0E8cAjiB+LEJn2fS7EdWIpe+HrGZfIR0fm4K1iy1E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=dx9RqBEI54YroTWaUOsOaafM79b7pBiOvACpYTczTVq/VLX0+U3NsSD3L52i87lL0VZw88LrNP9r7HcXZ9wN4Ofq0XYXetroFgWepELtRQbu21oa15UqHT6pNmAUWorr60IROvzjRmeF5kC3p+L1cXMgpJZTaThk1Umk3JbBZeY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=X1WehsN4; arc=fail smtp.client-ip=52.101.229.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="X1WehsN4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rAek6w06k45Ij2VjhOciVvJCD57n3OpWyD4/GBtRn8Ypy2okBj3HgLukde6f3ljFPk96JA4CJ8AJHjVeBXIi6KAPwLF/M00d8OPTBvRCbbDFKjGrCCjddc+JTycOwQfBZaAND8Kp0unT/E0ySud21uSzfCalKOlP4iKoWN8QRp7zJR6/EgLGmwAl9JSBel+R5G3QHzBTvJD61L6Ss75YshmRS//Tm8iUfX07riINmPgUdnZEeCvBWUs5rPOHS1tt5zw6u695bX8eoUa+1m8m8D609NVjOCSPMA5561rro9rAv8bGuPhEX6H5Hy3UO8UPtV5zfib4/1k+O5JKXnjFjg== 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=lsU2ghLuaruQAcGKhMFnciPVkjov3F5bBlSK2R2xJ+o=; b=uHYeEWcsbEAoiVksxw60WvdouwrZueVlaZdgWIwImbHlu3/r2dujEhty3aroX37KDQZG01cVCnm19xgMcHo29IBac8BSIeeJOOpVGEqOEz42JTJP7VjnjPoOdPwupgGB+WPkO+zdmXDhiehCm5fNKQpQO1nq1uPinXXfkoCKpSDyaKJNfYrGCnSUcFl9GonMu9eS4MM7vp7RINlsGEmAHnn1/npI0bSS25Ukjc7Yoh8J1SjquGypMQ3bk6aF+heyWwEHOoQjuArd/30wvBFAN47nvWL7UuXLw8leySUJ9HipPzk4ykl0du3rf1wHMS5uHqV72yvzVipiuiAbigJwXA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=lsU2ghLuaruQAcGKhMFnciPVkjov3F5bBlSK2R2xJ+o=; b=X1WehsN4eS1bcVlUaYr+s2tHADCNXY8MCW45Mg5JkdxC2DAAj7hO4PQZsW9qqaKUpxw3u+pGEot8ZjKN53KiQZxvGo1XBpE4fwvWAvNaurDjzGHhFWgZoEz1WcqcDdgBL1CJ7flpY9pEsFQ7KswmmP/mKCZeV548wQR+R51TBCk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:14 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:14 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 27/38] ntb_netdev: Multi-queue support Date: Sun, 18 Jan 2026 22:54:29 +0900 Message-ID: <20260118135440.1958279-28-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0135.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:37f::18) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 3d350ba5-f3c4-46a0-e6ab-08de5699348d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?//1DaGFumV64TtN3IObQwZDaTwFw58dy1nm8mE2YCFYmjhykaFo9iaEzoxej?= =?us-ascii?Q?IHOBU0sYKNwoLiDitOQPkiGRagx8uot7uTHmyI+IeN9SxDWaFC/VBtYmNUKB?= =?us-ascii?Q?EmG6/6rjrjRVBLHyyho1EA1Ju/Wh8CtDWoEfJrFIoPdvlfla2HPF/uMBCndq?= =?us-ascii?Q?lxHTW1m+0rSclKS66hDuxVy3x6MZLQ5UauBL+TdkvXEHkTU4UJ5zXK60YjaE?= =?us-ascii?Q?/xdRw8gsmBLZoZx7NZzPloRduTOg6e8ccGGBz+Gl4IGonwDglMssvKrQcExz?= =?us-ascii?Q?DuLUn/1jxmaqTM8iUlXP6s5KVZ04aIOekte5AageFlp4ny/LkznISC8xMseh?= =?us-ascii?Q?RYvyPSfGdMIDaza1BZCUJcFYxA1ryAZAsamp2JZ3ikCppRjyTvMaWwnuRS4z?= =?us-ascii?Q?vm3SgxYW/+1QIaNTaAyCclqKujwHmcU3z98N/OtC0qt9pXLSJG+ZPbOWf3ND?= =?us-ascii?Q?P0K4SpHWL43S+qXd+j/NvufOQGCzQEm04z7hLNY+fiDqHe/BH4nHg5Xhoxa1?= =?us-ascii?Q?FzAhQSd2X2zu2CX6I5m45AF1LZ4/eK53+AgOeRXknmQsfMAD+mE7JqfusIoZ?= =?us-ascii?Q?mD13xqNp7BfYKcYF1RzXkCegVB/qfRdfnCFVZdOzDMuMBwslyRkDEUK5HNPO?= =?us-ascii?Q?cMqjbNWbchFjubm0WEde/LAy/8mV4pf5+yxnKODTJt/IkrjtgOCyNGGu4HxZ?= =?us-ascii?Q?namIRlOwYoOYQ/QYkwyBgX8v3yIgDWJG07JFIiGaUsHLc1ftR/Di6wB+qcMG?= =?us-ascii?Q?Z1zw5CyY6H7O5ByMH0D23Y4t8IFfH5bx9oPvyDOaVUfL5y1HrWBDi89W/Zf/?= =?us-ascii?Q?T/WrTMzufTJ5znkXLm1MstjjxKMEDkcVRJYp7gBgSiTLyb+OA4pjgp3SAaw8?= =?us-ascii?Q?GepQ3CDC7sr2dC8SdCR3/vhEUcugSr6oD7jd/ioxBN4HYAkeLef7191vOOc9?= =?us-ascii?Q?G8qwldq3SnZC2l7g+RuldaAqVENREUubnnXUCsElSwFIjd1ptzzh3pAQ2Ggx?= =?us-ascii?Q?YxCU2dhYf9p1AV2C24BRK3FIiE6Kr5G5Ia8JTLRzo1XBL6Ohu2N2KTROZRG5?= =?us-ascii?Q?DFTdKX7Vd1KgJbpHdG0e4VoClLF+wj9ok8Z84fTT/JdgTnIdQWVVpXoq2QXC?= =?us-ascii?Q?2YSJLPHeMUnHCxM6Ew1DZaKDUwyHU2RnJ1TBd+livKLcaNzwEMAdYg0DDPKg?= =?us-ascii?Q?XTGwWoV/X7dqfL0zaIXm4GxEufZ/xu9nbhXZpwliHmDlyqE7AFL7GjPUbTe3?= =?us-ascii?Q?a+Fu8kFV3h/1jfU/G910n1NC+XNu/fLz4EWLhxWjziYQBVshLrnvL4J76vox?= =?us-ascii?Q?1Iq62/Cd8qaaXc8jhMYtOjQ+9QO+j9QBK6D20XzZBfaUEmfNYaJf939Q6sR1?= =?us-ascii?Q?JPPFz2Z5+XzXa6UUUcqMZN/8qokGWsmKnGJZ/YNKUAhUSQWGNhIr6yLdJRm7?= =?us-ascii?Q?Zwz14veoevfKd8/vQ95yPfj8Cz5CYvhL/w76zT9dMEHmjYbKOo97qyilyQfu?= =?us-ascii?Q?0Kh/hBIFLCkzaGvWiq3WXAQMp/cSpM1aZMFwgK6VjcwBJGy9AnEpwY3+OI5D?= =?us-ascii?Q?jev8KTl3A0bwQ8Mofk+DX/WoCojkTtUF1bS2eW/6zdDzcMxqC0yWGnt8DoY+?= =?us-ascii?Q?Ag=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?sX4jSrnEX2s/bpl/mkQNgbcFoTvaA/nlKGBQRP2IYt+XCt8M7wtemTX0RpS5?= =?us-ascii?Q?MGVUfh69n850/VNRpSak6UvbvASw8L8+sgP3Vh5qsESgHeL+Wpd5TzV/hHTu?= =?us-ascii?Q?ewOtkW6KdVVNzAOBFAcgzRU9S6PWCATmoiuejegTbAhDorNr9fF9B3JJTpZY?= =?us-ascii?Q?befyG0sOwuPdcUam7QWt+IxBmsVlg7NHTDGqizPQUacCAq8UoVs4eWZgxTNQ?= =?us-ascii?Q?QWzpnXF7UUbh/X2ys54N0RnRU5yxE1K2IbcNUdVtO4AIz0rwgNRBdoWUF1lP?= =?us-ascii?Q?xqJVhDxhoj8o8LUnG3O5NmjFftq9DKdzW3QtleEg31URjO+DVSLmNFDoAA3B?= =?us-ascii?Q?a/uF0SCIUJMMksl7Lmj39fS/sPSvhQU1qsTKo30z99e0jg0N5hRcrW7AzmiV?= =?us-ascii?Q?nkLJdSXkXj5D5ejTA2xhPiggfcM8Hy29E4LxcUd/Uatk44cgFMgASYfEQiSS?= =?us-ascii?Q?9BIw2nI4N3i8asmrvD2/soKZtNY/UlixD8Ili971PPplaRkIpT5KQ1TcO0yJ?= =?us-ascii?Q?wFCKZFw2MeFNGILgiFBjmtJFMrniVEs1Qj3S5oguvCKCnmfNVbNENi7n6Q+y?= =?us-ascii?Q?L3Cq3Y63lOtUm9/WoB0BhMawnT/+RIc/kNGAPOh3MSj2KHaB63kRJ4srui4J?= =?us-ascii?Q?kKm3Qigfbngqbzh+9F2ZKUt8+70IVQEq1TV9DC7jGyMUe+TUoNmqd3OFNPv5?= =?us-ascii?Q?rbUZ2iIzcDoqrQ0XVwy3ZtRl6fjizYf6w7SFc8HQRWpor+JsKKW1BkhuB5K/?= =?us-ascii?Q?bsRKrV2cX4hEmM8xVNBObmG6sY2c47sC1NfT4WEb2B0GmL4DeD8hgCtnqo+Z?= =?us-ascii?Q?w1Oy/FDo/F66ZwCPQVsiJPLU1VHPgnYb5+GAeG0B1rmEs0Ab12GavIEz+HJ2?= =?us-ascii?Q?RrXYQ/quTlFb+M61Ah+kDEMXZ4/BN5pZcOSU4rv03fkZUM1gSgYG7DeedMGI?= =?us-ascii?Q?Pn9nfqtDA5LAw7Zpb0dHpiL48wkhi+3cYkoVhBwtMjNILyol89ll3R6QhGDM?= =?us-ascii?Q?LTDbTepTg/Sijena8Ko8asRN1uWN5XKgK6NtjLpuMZX63d9eh1tNX3ILwveZ?= =?us-ascii?Q?kjbvQu6tOnRF2pbVAyPihUNFsUMNumwY5Ngcid1rM27kzr1Gr+v6WBKO7Zdh?= =?us-ascii?Q?uZgz1em9FSiz2WrkAZmlvMy+3B4jTPsh0kzdfIxlWSNYMZ1SK1mRceW2A/jf?= =?us-ascii?Q?gFB+rUPSect9I7aiu1H4pdxlscIaCVeYu03V1blROob++kaFUrLl6652F0Ap?= =?us-ascii?Q?8P4YMiHEwMP/5lh8+LDt8sPOhrKeqwOtMroxYsMozJXn/e2bhs5e/ku22PBX?= =?us-ascii?Q?frNyRjITJ/nCuaUox1ZQsF2dVd8bNB3fpTgQ59eB9GwOdFi1Ob83Kqlf4+TQ?= =?us-ascii?Q?vD7RYgj4XKgHs3HSqVtbg+y33xU18H3RZYgtWzgEAWKpWpXktiT2bbmiJ/5n?= =?us-ascii?Q?oq0sJfhYumFnZC0EsDuHtSa4IwTTY5m/y2e2hNR6vH2rQoxJGMW/xIYsteja?= =?us-ascii?Q?YGXsb/w6/11tExDp47w24Rr0eY7EsfSd38BOQbfQHFoqEqFT15jMmts/1qXG?= =?us-ascii?Q?8ELnUtEFGhqDmw46GuwgOBf5fHtDemtbzvOFcIJ0iksOvOwIFf7lUOM1wVAh?= =?us-ascii?Q?KNOcD+p+xs2rwtH2voVTt07+RPEArhGYXFIh33IWy7CJ6HVtAb9SNNGR8qrf?= =?us-ascii?Q?QgkyKUoHlXtLjbp4X35qY7rkcle5Twrhg4wf+R1ywp9W0dCxstMc3m9/0W4C?= =?us-ascii?Q?dxNpLfJMQY9MbXeLxDANuqmJblVW9gnboeiXIYKMVaQAXNy19e1T?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 3d350ba5-f3c4-46a0-e6ab-08de5699348d X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:14.5340 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 2XJdq5vgLzG0nGU+rzbLdzw1T/4twEGZ1eB+TkmcwAy2tvxbKcf1G51NDrxFsgbHaHYGJarjU8GlhWnJcrtQ/Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" In eDMA-backed mode (when using ntb_transport_edma), NTB transport can scale throughput across multiple queue pairs without being constrained by scarce BAR/memory window space used for data-plane buffers. It contrasts with the default ntb_transport, where even with a single queue pair, only up to 15 in-flight descriptors fit in a 1 MiB MW. Teach ntb_netdev to allocate multiple ntb_transport queue pairs and expose them as a multi-queue net_device. With this patch, up to N queue pairs are created, where N is chosen as follows: - By default, N is num_online_cpus(), to give each CPU its own queue. - If the ntb_num_queues module parameter is non-zero, it overrides the default and requests that many queues. - In both cases the requested value is capped at a fixed upper bound to avoid unbounded allocations, and by the number of queue pairs actually available from ntb_transport. If only one queue pair can be created (or ntb_num_queues=3D1 is set), the driver effectively falls back to the previous single-queue behavior. Signed-off-by: Koichiro Den --- drivers/net/ntb_netdev.c | 341 ++++++++++++++++++++++++++++----------- 1 file changed, 243 insertions(+), 98 deletions(-) diff --git a/drivers/net/ntb_netdev.c b/drivers/net/ntb_netdev.c index fbeae05817e9..fc300db66ef7 100644 --- a/drivers/net/ntb_netdev.c +++ b/drivers/net/ntb_netdev.c @@ -53,6 +53,8 @@ #include #include #include +#include +#include =20 #define NTB_NETDEV_VER "0.7" =20 @@ -70,26 +72,84 @@ static unsigned int tx_start =3D 10; /* Number of descriptors still available before stop upper layer tx */ static unsigned int tx_stop =3D 5; =20 +/* + * Upper bound on how many queue pairs we will try to create even if + * ntb_num_queues or num_online_cpus() is very large. This is an + * arbitrary safety cap to avoid unbounded allocations. + */ +#define NTB_NETDEV_MAX_QUEUES 64 + +/* + * ntb_num_queues =3D=3D 0 (default) means: + * - use num_online_cpus() as the desired queue count, capped by + * NTB_NETDEV_MAX_QUEUES. + * ntb_num_queues > 0: + * - try to create exactly ntb_num_queues queue pairs (again capped + * by NTB_NETDEV_MAX_QUEUES), but fall back to the number of queue + * pairs actually available from ntb_transport. + */ +static unsigned int ntb_num_queues; +module_param(ntb_num_queues, uint, 0644); +MODULE_PARM_DESC(ntb_num_queues, + "Number of NTB netdev queue pairs to use (0 =3D per-CPU)"); + +struct ntb_netdev; + +struct ntb_netdev_queue { + struct ntb_netdev *ntdev; + struct ntb_transport_qp *qp; + struct timer_list tx_timer; + u16 qid; +}; + struct ntb_netdev { struct pci_dev *pdev; struct net_device *ndev; - struct ntb_transport_qp *qp; - struct timer_list tx_timer; + unsigned int num_queues; + struct ntb_netdev_queue *queues; }; =20 #define NTB_TX_TIMEOUT_MS 1000 #define NTB_RXQ_SIZE 100 =20 +static unsigned int ntb_netdev_default_queues(void) +{ + unsigned int n; + + if (ntb_num_queues) + n =3D ntb_num_queues; + else + n =3D num_online_cpus(); + + if (!n) + n =3D 1; + + if (n > NTB_NETDEV_MAX_QUEUES) + n =3D NTB_NETDEV_MAX_QUEUES; + + return n; +} + static void ntb_netdev_event_handler(void *data, int link_is_up) { - struct net_device *ndev =3D data; - struct ntb_netdev *dev =3D netdev_priv(ndev); + struct ntb_netdev_queue *q =3D data; + struct ntb_netdev *dev =3D q->ntdev; + struct net_device *ndev =3D dev->ndev; + bool any_up =3D false; + unsigned int i; =20 - netdev_dbg(ndev, "Event %x, Link %x\n", link_is_up, - ntb_transport_link_query(dev->qp)); + netdev_dbg(ndev, "Event %x, Link %x, qp %u\n", link_is_up, + ntb_transport_link_query(q->qp), q->qid); =20 if (link_is_up) { - if (ntb_transport_link_query(dev->qp)) + for (i =3D 0; i < dev->num_queues; i++) { + if (ntb_transport_link_query(dev->queues[i].qp)) { + any_up =3D true; + break; + } + } + + if (any_up) netif_carrier_on(ndev); } else { netif_carrier_off(ndev); @@ -99,7 +159,9 @@ static void ntb_netdev_event_handler(void *data, int lin= k_is_up) static void ntb_netdev_rx_handler(struct ntb_transport_qp *qp, void *qp_da= ta, void *data, int len) { - struct net_device *ndev =3D qp_data; + struct ntb_netdev_queue *q =3D qp_data; + struct ntb_netdev *dev =3D q->ntdev; + struct net_device *ndev =3D dev->ndev; struct sk_buff *skb; int rc; =20 @@ -135,7 +197,8 @@ static void ntb_netdev_rx_handler(struct ntb_transport_= qp *qp, void *qp_data, } =20 enqueue_again: - rc =3D ntb_transport_rx_enqueue(qp, skb, skb->data, ndev->mtu + ETH_HLEN); + rc =3D ntb_transport_rx_enqueue(q->qp, skb, skb->data, + ndev->mtu + ETH_HLEN); if (rc) { dev_kfree_skb_any(skb); ndev->stats.rx_errors++; @@ -143,42 +206,37 @@ static void ntb_netdev_rx_handler(struct ntb_transpor= t_qp *qp, void *qp_data, } } =20 -static int __ntb_netdev_maybe_stop_tx(struct net_device *netdev, - struct ntb_transport_qp *qp, int size) +static int ntb_netdev_maybe_stop_tx(struct ntb_netdev_queue *q, int size) { - struct ntb_netdev *dev =3D netdev_priv(netdev); + struct net_device *ndev =3D q->ntdev->ndev; + + if (ntb_transport_tx_free_entry(q->qp) >=3D size) + return 0; + + netif_stop_subqueue(ndev, q->qid); =20 - netif_stop_queue(netdev); /* Make sure to see the latest value of ntb_transport_tx_free_entry() * since the queue was last started. */ smp_mb(); =20 - if (likely(ntb_transport_tx_free_entry(qp) < size)) { - mod_timer(&dev->tx_timer, jiffies + usecs_to_jiffies(tx_time)); + if (likely(ntb_transport_tx_free_entry(q->qp) < size)) { + mod_timer(&q->tx_timer, jiffies + usecs_to_jiffies(tx_time)); return -EBUSY; } =20 - netif_start_queue(netdev); - return 0; -} - -static int ntb_netdev_maybe_stop_tx(struct net_device *ndev, - struct ntb_transport_qp *qp, int size) -{ - if (netif_queue_stopped(ndev) || - (ntb_transport_tx_free_entry(qp) >=3D size)) - return 0; + netif_wake_subqueue(ndev, q->qid); =20 - return __ntb_netdev_maybe_stop_tx(ndev, qp, size); + return 0; } =20 static void ntb_netdev_tx_handler(struct ntb_transport_qp *qp, void *qp_da= ta, void *data, int len) { - struct net_device *ndev =3D qp_data; + struct ntb_netdev_queue *q =3D qp_data; + struct ntb_netdev *dev =3D q->ntdev; + struct net_device *ndev =3D dev->ndev; struct sk_buff *skb; - struct ntb_netdev *dev =3D netdev_priv(ndev); =20 skb =3D data; if (!skb || !ndev) @@ -194,13 +252,12 @@ static void ntb_netdev_tx_handler(struct ntb_transpor= t_qp *qp, void *qp_data, =20 dev_kfree_skb_any(skb); =20 - if (ntb_transport_tx_free_entry(dev->qp) >=3D tx_start) { + if (ntb_transport_tx_free_entry(qp) >=3D tx_start) { /* Make sure anybody stopping the queue after this sees the new * value of ntb_transport_tx_free_entry() */ smp_mb(); - if (netif_queue_stopped(ndev)) - netif_wake_queue(ndev); + netif_wake_subqueue(ndev, q->qid); } } =20 @@ -208,16 +265,26 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_bu= ff *skb, struct net_device *ndev) { struct ntb_netdev *dev =3D netdev_priv(ndev); + u16 qid =3D skb_get_queue_mapping(skb); + struct ntb_netdev_queue *q; int rc; =20 - ntb_netdev_maybe_stop_tx(ndev, dev->qp, tx_stop); + if (unlikely(!dev->num_queues)) + goto err; + + if (unlikely(qid >=3D dev->num_queues)) + qid =3D qid % dev->num_queues; =20 - rc =3D ntb_transport_tx_enqueue(dev->qp, skb, skb->data, skb->len); + q =3D &dev->queues[qid]; + + ntb_netdev_maybe_stop_tx(q, tx_stop); + + rc =3D ntb_transport_tx_enqueue(q->qp, skb, skb->data, skb->len); if (rc) goto err; =20 /* check for next submit */ - ntb_netdev_maybe_stop_tx(ndev, dev->qp, tx_stop); + ntb_netdev_maybe_stop_tx(q, tx_stop); =20 return NETDEV_TX_OK; =20 @@ -229,80 +296,103 @@ static netdev_tx_t ntb_netdev_start_xmit(struct sk_b= uff *skb, =20 static void ntb_netdev_tx_timer(struct timer_list *t) { - struct ntb_netdev *dev =3D timer_container_of(dev, t, tx_timer); + struct ntb_netdev_queue *q =3D container_of(t, struct ntb_netdev_queue, t= x_timer); + struct ntb_netdev *dev =3D q->ntdev; struct net_device *ndev =3D dev->ndev; =20 - if (ntb_transport_tx_free_entry(dev->qp) < tx_stop) { - mod_timer(&dev->tx_timer, jiffies + usecs_to_jiffies(tx_time)); + if (ntb_transport_tx_free_entry(q->qp) < tx_stop) { + mod_timer(&q->tx_timer, jiffies + usecs_to_jiffies(tx_time)); } else { - /* Make sure anybody stopping the queue after this sees the new + /* + * Make sure anybody stopping the queue after this sees the new * value of ntb_transport_tx_free_entry() */ smp_mb(); - if (netif_queue_stopped(ndev)) - netif_wake_queue(ndev); + netif_wake_subqueue(ndev, q->qid); } } =20 static int ntb_netdev_open(struct net_device *ndev) { struct ntb_netdev *dev =3D netdev_priv(ndev); + struct ntb_netdev_queue *queue; struct sk_buff *skb; - int rc, i, len; - - /* Add some empty rx bufs */ - for (i =3D 0; i < NTB_RXQ_SIZE; i++) { - skb =3D netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN); - if (!skb) { - rc =3D -ENOMEM; - goto err; - } + int rc =3D 0, i, len; + unsigned int q; =20 - rc =3D ntb_transport_rx_enqueue(dev->qp, skb, skb->data, - ndev->mtu + ETH_HLEN); - if (rc) { - dev_kfree_skb(skb); - goto err; + /* Add some empty rx bufs for each queue */ + for (q =3D 0; q < dev->num_queues; q++) { + queue =3D &dev->queues[q]; + + for (i =3D 0; i < NTB_RXQ_SIZE; i++) { + skb =3D netdev_alloc_skb(ndev, ndev->mtu + ETH_HLEN); + if (!skb) { + rc =3D -ENOMEM; + goto err; + } + + rc =3D ntb_transport_rx_enqueue(queue->qp, skb, skb->data, + ndev->mtu + ETH_HLEN); + if (rc) { + dev_kfree_skb(skb); + goto err; + } } - } =20 - timer_setup(&dev->tx_timer, ntb_netdev_tx_timer, 0); + timer_setup(&queue->tx_timer, ntb_netdev_tx_timer, 0); + } =20 netif_carrier_off(ndev); - ntb_transport_link_up(dev->qp); - netif_start_queue(ndev); + + for (q =3D 0; q < dev->num_queues; q++) + ntb_transport_link_up(dev->queues[q].qp); + + netif_tx_start_all_queues(ndev); =20 return 0; =20 err: - while ((skb =3D ntb_transport_rx_remove(dev->qp, &len))) - dev_kfree_skb(skb); + for (q =3D 0; q < dev->num_queues; q++) { + queue =3D &dev->queues[q]; + + while ((skb =3D ntb_transport_rx_remove(queue->qp, &len))) + dev_kfree_skb(skb); + } return rc; } =20 static int ntb_netdev_close(struct net_device *ndev) { struct ntb_netdev *dev =3D netdev_priv(ndev); + struct ntb_netdev_queue *queue; struct sk_buff *skb; + unsigned int q; int len; =20 - ntb_transport_link_down(dev->qp); + netif_tx_stop_all_queues(ndev); + + for (q =3D 0; q < dev->num_queues; q++) { + queue =3D &dev->queues[q]; =20 - while ((skb =3D ntb_transport_rx_remove(dev->qp, &len))) - dev_kfree_skb(skb); + ntb_transport_link_down(queue->qp); =20 - timer_delete_sync(&dev->tx_timer); + while ((skb =3D ntb_transport_rx_remove(queue->qp, &len))) + dev_kfree_skb(skb); =20 + timer_delete_sync(&queue->tx_timer); + } return 0; } =20 static int ntb_netdev_change_mtu(struct net_device *ndev, int new_mtu) { struct ntb_netdev *dev =3D netdev_priv(ndev); + struct ntb_netdev_queue *queue; struct sk_buff *skb; - int len, rc; + unsigned int q, i; + int len, rc =3D 0; =20 - if (new_mtu > ntb_transport_max_size(dev->qp) - ETH_HLEN) + if (new_mtu > ntb_transport_max_size(dev->queues[0].qp) - ETH_HLEN) return -EINVAL; =20 if (!netif_running(ndev)) { @@ -311,41 +401,54 @@ static int ntb_netdev_change_mtu(struct net_device *n= dev, int new_mtu) } =20 /* Bring down the link and dispose of posted rx entries */ - ntb_transport_link_down(dev->qp); + for (q =3D 0; q < dev->num_queues; q++) + ntb_transport_link_down(dev->queues[q].qp); =20 if (ndev->mtu < new_mtu) { - int i; - - for (i =3D 0; (skb =3D ntb_transport_rx_remove(dev->qp, &len)); i++) - dev_kfree_skb(skb); + for (q =3D 0; q < dev->num_queues; q++) { + queue =3D &dev->queues[q]; =20 - for (; i; i--) { - skb =3D netdev_alloc_skb(ndev, new_mtu + ETH_HLEN); - if (!skb) { - rc =3D -ENOMEM; - goto err; - } - - rc =3D ntb_transport_rx_enqueue(dev->qp, skb, skb->data, - new_mtu + ETH_HLEN); - if (rc) { + for (i =3D 0; + (skb =3D ntb_transport_rx_remove(queue->qp, &len)); + i++) dev_kfree_skb(skb); - goto err; + + for (; i; i--) { + skb =3D netdev_alloc_skb(ndev, + new_mtu + ETH_HLEN); + if (!skb) { + rc =3D -ENOMEM; + goto err; + } + + rc =3D ntb_transport_rx_enqueue(queue->qp, skb, + skb->data, + new_mtu + + ETH_HLEN); + if (rc) { + dev_kfree_skb(skb); + goto err; + } } } } =20 WRITE_ONCE(ndev->mtu, new_mtu); =20 - ntb_transport_link_up(dev->qp); + for (q =3D 0; q < dev->num_queues; q++) + ntb_transport_link_up(dev->queues[q].qp); =20 return 0; =20 err: - ntb_transport_link_down(dev->qp); + for (q =3D 0; q < dev->num_queues; q++) { + struct ntb_netdev_queue *queue =3D &dev->queues[q]; + + ntb_transport_link_down(queue->qp); =20 - while ((skb =3D ntb_transport_rx_remove(dev->qp, &len))) - dev_kfree_skb(skb); + while ((skb =3D ntb_transport_rx_remove(queue->qp, &len))) + dev_kfree_skb(skb); + } =20 netdev_err(ndev, "Error changing MTU, device inoperable\n"); return rc; @@ -404,6 +507,7 @@ static int ntb_netdev_probe(struct device *client_dev) struct net_device *ndev; struct pci_dev *pdev; struct ntb_netdev *dev; + unsigned int q, desired_queues; int rc; =20 ntb =3D dev_ntb(client_dev->parent); @@ -411,7 +515,9 @@ static int ntb_netdev_probe(struct device *client_dev) if (!pdev) return -ENODEV; =20 - ndev =3D alloc_etherdev(sizeof(*dev)); + desired_queues =3D ntb_netdev_default_queues(); + + ndev =3D alloc_etherdev_mq(sizeof(*dev), desired_queues); if (!ndev) return -ENOMEM; =20 @@ -420,6 +526,15 @@ static int ntb_netdev_probe(struct device *client_dev) dev =3D netdev_priv(ndev); dev->ndev =3D ndev; dev->pdev =3D pdev; + dev->num_queues =3D 0; + + dev->queues =3D kcalloc(desired_queues, sizeof(*dev->queues), + GFP_KERNEL); + if (!dev->queues) { + rc =3D -ENOMEM; + goto err_free_netdev; + } + ndev->features =3D NETIF_F_HIGHDMA; =20 ndev->priv_flags |=3D IFF_LIVE_ADDR_CHANGE; @@ -436,26 +551,51 @@ static int ntb_netdev_probe(struct device *client_dev) ndev->min_mtu =3D 0; ndev->max_mtu =3D ETH_MAX_MTU; =20 - dev->qp =3D ntb_transport_create_queue(ndev, client_dev, - &ntb_netdev_handlers); - if (!dev->qp) { + for (q =3D 0; q < desired_queues; q++) { + struct ntb_netdev_queue *queue =3D &dev->queues[q]; + + queue->ntdev =3D dev; + queue->qid =3D q; + queue->qp =3D ntb_transport_create_queue(queue, client_dev, + &ntb_netdev_handlers); + if (!queue->qp) + break; + + dev->num_queues++; + } + + if (!dev->num_queues) { rc =3D -EIO; - goto err; + goto err_free_queues; } =20 - ndev->mtu =3D ntb_transport_max_size(dev->qp) - ETH_HLEN; + rc =3D netif_set_real_num_tx_queues(ndev, dev->num_queues); + if (rc) + goto err_free_qps; + + rc =3D netif_set_real_num_rx_queues(ndev, dev->num_queues); + if (rc) + goto err_free_qps; + + ndev->mtu =3D ntb_transport_max_size(dev->queues[0].qp) - ETH_HLEN; =20 rc =3D register_netdev(ndev); if (rc) - goto err1; + goto err_free_qps; =20 dev_set_drvdata(client_dev, ndev); - dev_info(&pdev->dev, "%s created\n", ndev->name); + dev_info(&pdev->dev, "%s created with %u queue pairs\n", + ndev->name, dev->num_queues); return 0; =20 -err1: - ntb_transport_free_queue(dev->qp); -err: +err_free_qps: + for (q =3D 0; q < dev->num_queues; q++) + ntb_transport_free_queue(dev->queues[q].qp); + +err_free_queues: + kfree(dev->queues); + +err_free_netdev: free_netdev(ndev); return rc; } @@ -464,9 +604,14 @@ static void ntb_netdev_remove(struct device *client_de= v) { struct net_device *ndev =3D dev_get_drvdata(client_dev); struct ntb_netdev *dev =3D netdev_priv(ndev); + unsigned int q; + =20 unregister_netdev(ndev); - ntb_transport_free_queue(dev->qp); + for (q =3D 0; q < dev->num_queues; q++) + ntb_transport_free_queue(dev->queues[q].qp); + + kfree(dev->queues); free_netdev(ndev); } =20 --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021122.outbound.protection.outlook.com [40.107.74.122]) (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 A23F733CE83; Sun, 18 Jan 2026 13:55:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744552; cv=fail; b=SmoeGFwHVnUS67jRnnkZO+CuUimlUgvtqgOEpi4alNWYAvP+UgfATU9Kq+0gyb20L+7GYSf1We31gmXFpvNVVVGBV7/rCaJCA5LzIvHsqzjyPMwECm0sS/WGBPBQdYrvfQNWlNtCJmhQ/lDYePgI8pKriDph+0iMoCEPKMN9p3c= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744552; c=relaxed/simple; bh=0A3xkqVWiRQ/04TfgJdKO+PKB+im5i+bWqzGfyELq3k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=QFcsosfSHG8MLxP5j5inDvld6WHCQfZrzil1Hj1IWVhVZ4e31A5okmj+Kg+206RLmiYdemZ5njLPO+VXDQLWLNFzeAVs50Z8g0Cae/nN39UlQ+Tq+giyxW/HPNo/u9CBo+JWkdA25gfHgdROhpjZUDRM8qn7QyizPxt8RmoIys8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=JIV1surE; arc=fail smtp.client-ip=40.107.74.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="JIV1surE" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BzHf8CPb45nBUhw++M/o9fnDQeWYOjHqb1aImSsVAm11u20GNjfjT+opylGyUBrLr2nI5f0X0+ZYnHNDO1ph9gQ4eORBsPzeFoCW+nokhzkSXdMP5G7cf/5iDDmDONnGrtVAfl2k1mNqP+2z2+H5x1vYWYT1I7wMZvKNaOjakywW40fUG+BhyGXisnVjwBBZb3JoKZSFNfWhwEDHYaosAYuGYUoPW5zXOV3WOCt2hzg1u9v11bNY3BQMYcu3WJBHXU5fwl62DPFsVWCavxaHSg9C8KrBQrUnSnRTVmbCah/4gxGD9VVbYs/Fmd38vn/fvbaME6Jxk81h57I/mVB91g== 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=0UDTuV4vVEOzVHwmwk1GDcwOpMfmBdbAREqdadxzsRs=; b=RFBoWST6s9xKx28PqKQrrvySH1dWIjzo38qoP2Wy/VOiLyxZMprJ0aCyu7PtgutfziR374DeltL84fs0JTBFJkmfbUU7mRdrayiEzujsrbs6HhU283+dRyuaI/ZGgOFC5BzMGjaSo7E1ZqDHiq8RfzPvzT0JVOHuwtcNzVtK/av7DfnavMl9SbH4AL8fVVYvt1pMxPxXycBdw1Fi2v5oKsto9qQuyAt7F+uz0hY2gxCCF5g7e/K+eMUM0Rn0rmHuQ9csgg2ce9Z3I/rmjhVMst4dAYLiUxrwtgfzdpXJaVq1Bru/E1FKi6eJ14qQ5NkXZ+ZGjmVbz5tI8rHA7APbmg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=0UDTuV4vVEOzVHwmwk1GDcwOpMfmBdbAREqdadxzsRs=; b=JIV1surErcrmzqS9nQ/MBugoa2psyC03YsKeIkWyCQbQrejXZdLToj+OGF0bQXo+ZpyTjn49BoHdqagfG2SQ3U1uaAD50C1S+9W3wwqF42PSGkNYykRup2OkErC/lR65Jums0miyKDCKzQ9bH591wL2p2CJ1O3BbtLUSbCGc+JE= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:15 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:15 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 28/38] iommu: ipmmu-vmsa: Add PCIe ch0 to devices_allowlist Date: Sun, 18 Jan 2026 22:54:30 +0900 Message-ID: <20260118135440.1958279-29-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0113.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:37c::8) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: a3891caf-f38a-4963-e6ab-08de56993500 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?rikIWMzDnoPEL4dp+ZIN4aVVjcZFjUioqij4+ReNoQtOJnhEwYlvWZKeCzF8?= =?us-ascii?Q?M4LpEmixuc2XqAFFYm+Xtsy7GrOO7IkCCwWDqX01vETN1a7TlyCf5cdzor55?= =?us-ascii?Q?/gvy49TzUF54y9mClCThhFvdSnnKUu0niEHIHCdb9fXZuQBCuFU42rlmjMY5?= =?us-ascii?Q?5h1WqBgeiCfAsdriTtSOku5a59z2XN/lg6MPECnkXTKDHNU5h9eALa90maMX?= =?us-ascii?Q?rKAyEZStQxp9XVU3yWELcKLMLC0rNE3bxpU+7Xc0HY1Apa9IVBZhEco0zfFu?= =?us-ascii?Q?pTt/acyrbZz4+urWswjFtzfxwAmuVTxq9T8YMmMEaiXBMiU3eNqSIWqOzep7?= =?us-ascii?Q?ZrZbKJGW6uGW7cvU3vygJFAr+h2GgEaMGHuG5wSYFMoWcd+wmfQM0IYn76r2?= =?us-ascii?Q?jSsiJvhzhL3eedIIJjUFRWbfADsg1oMCJ+R2CThz5YYJPUNQcVQDsO+sZFjM?= =?us-ascii?Q?CZIn3x30lHl+MN2CO5Y2KvGPbdD0i/ZCtt5aF+dToGk/Wo1SEFhbCzW8PmEf?= =?us-ascii?Q?R0iAxztOH69PoPdde72p8i4t7H0XNq3ma6WaKI2Z3Rf8Z55BdEvAuXYnpVg2?= =?us-ascii?Q?YqZ4XIwlsj44TxlTHGsfjQ4IEXNHsaOKucLX30ZPuO4sgMy1SkQg9LE1QwRy?= =?us-ascii?Q?91U/4rIXQfqBZrrvCCtnCQq/KxLiaREczaln/xl7D/HCD4Nh402ZE5aLlnj3?= =?us-ascii?Q?0AEkiXml1Jhztd2gFRVwDBzFsAyJTAxzil2Q3Sy6eRQHt8V0Pd9FDBwhGsj0?= =?us-ascii?Q?4xJ4fE1PaRPRlhpkazqrwMwEfK42YgoRF8tb7pJNzmm79l7eM3KFlXKKe88B?= =?us-ascii?Q?daBSJMXgW2cvm5YK4YnIK23hALbTG8TBCA/KArHyxlowq1qE/PqReGi00qhq?= =?us-ascii?Q?3pDRse78wMzGX92+6+YCMftXG9ZAM9HgB3xX4I8FtsFLCHvCtHp9G2yVBXt5?= =?us-ascii?Q?FIm3dEM7eHuVyF2gPIX80f7qOC5S8/2yzUw9KjrhLzObyZYJkd/5ZgL9UHzP?= =?us-ascii?Q?8/wIqX1wasgyP/Il6SK/y83XhuhOZD2r04VHuntD37v9T4x9d0SOwOQUOFNP?= =?us-ascii?Q?x6En+mfIt39z3tf+NQ1yyWnyrVrpee7sAmTNPn6SOUXBtSq1CtaEq7F0lo7c?= =?us-ascii?Q?XxNeywMMRe8Rokk1E88gZqh5kRSCAXD3N4k4iISJlH1ohz6elhs3V8tnXrJK?= =?us-ascii?Q?i5TDg6WyAGdaDlx5L9wwf7JRUPvy3ikZpPdJab7CH5kYQotdGw5JD/9WEnDb?= =?us-ascii?Q?Ldete4xPFprI/QSPDlJQuwrbGvqdulamYtIoufzPNVdwcCh5ttlOEYxnzlSA?= =?us-ascii?Q?BJxkfe3PEVwRg21R3WOgwUjsgJz/7tHT0LyJ3cAKA9IcTjPrG3Sf+Vw6WYJh?= =?us-ascii?Q?3d6Ez/6WTyHGlx1X27OCiI8Pe1EcxanF2hqzpdpF5WWW75/Ib4g3lwNQx9hI?= =?us-ascii?Q?KNW8GzGUjQpqZ52EvXoLbX3MZPLmmtuAnDQ+ARSKRJ4WeP/wde3HJLMm2sbx?= =?us-ascii?Q?cNGdr/G9uzgw2NJGuBLTpdYdVqysU8Uu4GnMtyRAFBmRzDfdWJG/CVtQIlQ8?= =?us-ascii?Q?QgilSymt0GdTHgC9h6IKbXxM7gxDODZszVAggUL2VfDtl7Tj0nHYG/l+pb6b?= =?us-ascii?Q?rQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Rf5WTurTTHy1STy7MdsY9fV9koIaMQ4cjk8dFr/dPWsqmAqdFT5a5f8GyeBW?= =?us-ascii?Q?MMFCGK6EAUclLj6bSy2r8bzZL9PAtENmzbfb5dvzPx9KfwTNIu45eIkp6jKW?= =?us-ascii?Q?Ys/li1J4mZiaPMIMMW5nyQfYfN79a/nbxY76zHjvDW8u3HEZdF1hViLN1OGH?= =?us-ascii?Q?xIW+iVc6q0n8wyvFvi6mFGt8mK/m0pNcQAZ9FKBBZOZBHX6GmJh8lVZbiva2?= =?us-ascii?Q?tTTvrkWiDNb/o2irGq/reqxet44DD1uIPKXuIpd8xx1T/TZ4cKHSZSSo+Slt?= =?us-ascii?Q?jQk4sNa8B3nFUlWwLh5G5wi9GQ4aT4tk1vnudWBbz+pnHXXfll6uczpelY9+?= =?us-ascii?Q?SZyBOKD9FcBpGyewDODp3ucmYh93/9seI4FCXWjAYL1pwYJC/9kc42258TL6?= =?us-ascii?Q?hoX9HiFAj/E0hU79FirP3XMipVY0EQ6TuouDMJSlBzZq65+lOfp0fC2ce0VJ?= =?us-ascii?Q?8ztwzP4+bbNgjI38TADWhyES95QGmKd0c8m6yrAjarfL7+hWkeNH8wNfHEOG?= =?us-ascii?Q?3l8iLxZznF/yGtxqy0Y8rRJCNoDQlSTYKoNH+XTHMx0s6kMENj/Zv3qmVgLH?= =?us-ascii?Q?s71qYs4kcg9buOufl+jRrJRVZlanHhzX31JHWL1Sv0QPb5+3rjni1fQSg5Xb?= =?us-ascii?Q?ps+Per/k6eRdA238uifqmkYJSXfHifhUkNEVgJk8BfIupL02D3XHkTRpxyvi?= =?us-ascii?Q?Ow6CLfY/SdpFYwtIpA2aZGokAlmoymYTuxHHJ2pHliUVunrF4/tZ30Ifo4gU?= =?us-ascii?Q?nmCJqgwoRdwc+cr6vpA01i2WScPqUveBihNzgM8kYEXkNVJ9empJsG9toEN3?= =?us-ascii?Q?285RYsPYBCXjuVax6c/7R1DWmczRaOn2MEXAmTMS3FyYmWDeRsvfZNRJRakf?= =?us-ascii?Q?sOH4i+hwQdOBdPScpm3QZ8LOJKC1tk4sAmKP0iCzyWvXK9w6ZlRk6fhpY8P1?= =?us-ascii?Q?+QwUHXzR/H5YZPA3zOnd+BqhHK0XeHHT45oQU9qB8r7SyWT8gD2P7Ktpiq6a?= =?us-ascii?Q?zZoU/IjeTY/1iOrofDsxYcDLVEZt3u9DlIJ3q4Zb7IJ1x3JsfAhIGUWavuwt?= =?us-ascii?Q?FvrqcGud0bREziPPVxcC3/C2rn52XCL0nCOyytNXI7rNIklddHPnqPBzrG2p?= =?us-ascii?Q?TsG2KEw+K5y2jDuMFo6Kwl3oY0e6k+0FN5oqqpJFIqWPX0oCAVYcVDVBn5bn?= =?us-ascii?Q?gwP2A5llvFxG+xB9BXah39HniSp0BAWz45LWqUoBtZLrPOyIhAVN0JvWH5CG?= =?us-ascii?Q?j1DC7Ik7MQj2cY0HO6iSBP9WIKfEdM44jzfgZXFnGFXyn28Vqk359Mbvg7h1?= =?us-ascii?Q?b5iQoM6dhNd9d+uYk5mgrujamI7aiov4/8uA5/sdo2Ypp/5VroKFmOpPTJCQ?= =?us-ascii?Q?8EpgCImNJkQhVuQO8TmO0zPKf/k1NMcsNrGoo7a1B8iWDhKSPIqieqVTXUmA?= =?us-ascii?Q?e8919OAEOkPPJQ6ASv54SkFyzkH/1UtgIh71YE9Zz8oypviVMiFilIc19EDA?= =?us-ascii?Q?ptEGp9tU9F6FmaKqgixp7OVvqro/zcPpwcIC5S1hb7zEMwev8ZRSDmFW2In8?= =?us-ascii?Q?aErbVDx7whkqvcRLsmWNQXn7UhN2EL4g7Xg2mJXAHPMmBPv3TaCfxQk7ra2P?= =?us-ascii?Q?lzZX2lnWaoE76k+fDgvJg2cY6w3jMk2izSUph7bgGcE1Uz/fcfFob+JDDUC4?= =?us-ascii?Q?i4CjfDJ6XoufMQQbHVDkanWLURjLmtfXE5KBnH8rv8bw4JAMp7w7kZmr1VvD?= =?us-ascii?Q?QqvlXfusGflvcWFFtBfrv0aqIm1RnNoYz47qVpxnxpq9r81Rx9so?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: a3891caf-f38a-4963-e6ab-08de56993500 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:15.2779 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: XedNUuKvV8yTF4wjohP7TOg3UcFGcINRl+vdkl3HODoKG/TN2n46gdFMX952oUvfAb0BkCt/qW1G7Mv2SDIs+w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Add the PCIe ch0 to the ipmmu-vmsa devices_allowlist so that traffic routed through this PCIe instance can be translated by the IOMMU. Signed-off-by: Koichiro Den --- drivers/iommu/ipmmu-vmsa.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c index ca848288dbf2..724d67ad5ef2 100644 --- a/drivers/iommu/ipmmu-vmsa.c +++ b/drivers/iommu/ipmmu-vmsa.c @@ -743,7 +743,9 @@ static const char * const devices_allowlist[] =3D { "ee100000.mmc", "ee120000.mmc", "ee140000.mmc", - "ee160000.mmc" + "ee160000.mmc", + "e65d0000.pcie", + "e65d0000.pcie-ep", }; =20 static bool ipmmu_device_is_allowed(struct device *dev) --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021096.outbound.protection.outlook.com [52.101.125.96]) (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 D962334EEEA; Sun, 18 Jan 2026 13:55:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.96 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744555; cv=fail; b=rNFUwwkgUX+GpFCz8DeHeemMQkSjA6DaGoXBn4b7ZGEWTk+TUPvX8cV6nX1IQrztXGY/I0id91U85FXXmnF5GCFOot0FWKNUSBfAMZHS1C11EsONbr5Fd+Onbo22Z8Xh+OSfUgKrnVEr3qL41lr2HbU3qxGZFmvNCIUXY2moyKQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744555; c=relaxed/simple; bh=7y01TviDYCFP/OTuFTh5SMbzmrAUj1Yo4q84GVIFXEE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=i97fN+5mnL5nDOB/vyrN/TillBm4L0pk7D82V+Ehls/V9rZ8DXnEIKaUEuoe3EGow72ncvo/Sic+byhESJMnirQuW/oAN0nQtcVJrMSBb3VirFr2ZU1MpKfls1K8zXK3pVOho+Z8kMN5GnXjH9X8KcbkZA5L+xQOR4m5l7blbYs= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=H2hjcK/Z; arc=fail smtp.client-ip=52.101.125.96 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="H2hjcK/Z" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=P7WW0xAJWa6ygS/Eg3sHkvMOytcgkCXaOOXVXKsmk29tFf1T4sH7MsKHh6IePMYNrsj7I/03Xwan7dYv3KL02E9GMn12VUlNgqoakZPeBPQhHyCC35xBdzE9yYRXYgfDEHRDWfdRoYALnWG+5p/WDeF1cz5xygJVjmefqTrSqs9gqHRtNEuv5nUFEmmxGpastyyr9kUzL9GkYb33lZZKdmINkB+LWnCaD98X9BclmUnJaZKbQWp0Lp5rsLmEOqQp4mJGaWNcK8UYrFCepg1lczjEZhnO505ddwmadmL0DNov51W/uRlJEh42y57uAs8orbcpEUlFWaNPi5HZ077QnA== 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=9SZni+m8Up+trZkWVtYU2nXw/H2fvWLTQUnEPIEJoK4=; b=icTwZVwnJZIhopqWYFmEgLATQY5jto08X3TWuRhGf4ZUN1rrognFeEUwCFcbK8SpeJjBFdjcSRg4Ro826fsNmyig9fbYq01V+UhNitx8vhWM051tIvhKO6132LiC29wEztg23nLpZLzHLrdnLQKpB+NRDkPuN7oyRM2nhUNMgtApYmGIhT8bicBY9ojFTF9kx9QwIgcP/WkyB34crZ3qYz15QarJ169MYHFpFYyhgCzTBeHWlpuDAbkrKfYnTEmOTjiqERUL9XnKOM9+QgxHxVSI8YgCv0W2ZYQtVk+884M1BWgT58gHka8EiK5iMkJ+qtV+2TvgZtteGvOCGgQdiw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=9SZni+m8Up+trZkWVtYU2nXw/H2fvWLTQUnEPIEJoK4=; b=H2hjcK/Z6IFVVfKcePn/BM0rHXFIY/rjHMIWqYTjwvI0IyMXN9BgYSzZEvLO/aQERPIxI2cfW+/DRHP/3LBRghVjOoeToLYpiecslume1BmvFj0U0r/MD3XkxXvUOZRdYjilcutxsem+moEB6x+PYVEtDa8MiIULn7XtevY9bx0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:16 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:16 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 29/38] iommu: ipmmu-vmsa: Add support for reserved regions Date: Sun, 18 Jan 2026 22:54:31 +0900 Message-ID: <20260118135440.1958279-30-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0128.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:37f::17) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 7fcc252a-52a2-4e59-78de-08de56993573 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?w23mPTbalfR4cPXaI+g+pWknc29rmsAZM5xHRF1eLJsUtrIYXJyXaJBlpf73?= =?us-ascii?Q?iv4ls1AIqF3iYpVqJ6WHVUuKwMt3t8gJxjWmXpPBzKtWfUCKdwaiJCJJwArF?= =?us-ascii?Q?nH1oQo7cZAC8q/BW26qjw2AaTZgtSz3Gal8hcFNbqR0p81Lvxe77HChHSaHB?= =?us-ascii?Q?H9hCY7L27iJ03k5M20ljo1YhlrKvnurlFDN7QO9FXFTxf+JooqY+pcaHXES4?= =?us-ascii?Q?8BBpr1h87qtT+aESXQZHyTjziTyZIRIHyUkaYvyRTcsvJr0FeQmc30aLKDv2?= =?us-ascii?Q?A75Xoo8ulbUS3m06bFE7FvU9ABYlaxQKjpkn+dJnXr6XI/TkDxWIGrNr8NIp?= =?us-ascii?Q?7ClnPu6RCEgBkzEGHYmb15e6uahxhV53b5DXbwThZKcp9ZRGIqQ2JHmoIehG?= =?us-ascii?Q?cOInmfEce3kPtfVDTkVe63leJ//vJ9kVtxdW4Q62S99aSWo2TBkcPDA7FiP5?= =?us-ascii?Q?3749yxoNfqbPHC91r+M9ERt477VPVoNMwUBiGFzlSRf4q87LzFTGqIE01tqe?= =?us-ascii?Q?fhlqLLAM8J1A+yRrsjiQZ0Bk+onwVcpkUj7S7htCs8+yUL4Yqz3W/0nQ2wAi?= =?us-ascii?Q?qIQN6pqkH8rXQHfF97qoYZT8Kz6fhyFhiCQjxiz5WeNEBmrbuMkTes5oLBoR?= =?us-ascii?Q?pqEIA0X2WBlZHgLdFzX1JZR7/TYPY7b2EbRpOEshTHm+scmTEIgV+IfQRNcF?= =?us-ascii?Q?WPKDxuILa4Z93k9TuCaMOnXBXGNMdyoP1OE2GcMKe6aFfaZL/RYIWAUjOJ1g?= =?us-ascii?Q?gCzZAPmBdVQp78Yx11hwsbixEs+kGSBDXdNfw5n8Aj3ymi3+7eIIJE0BZzw6?= =?us-ascii?Q?x1Qqy9IxjInGS4BeUEVdiXaQ6gT8PWwZ4GPqA/Ol468kYUNvJOHywNw8yuD3?= =?us-ascii?Q?ze6k1tAC4gtWr7m2ENXAfDit+qoV3U+096LMeK99QgYFFqfExa1PNuuw+uWa?= =?us-ascii?Q?ou5pFg28PZqfAXVKYuasxb8KDI38ybOHcZbkXq0hLwWG8qz+uSVuRJk5ouV0?= =?us-ascii?Q?V7TJ7UYeXvTpNReahp+/O0+8rFLycBW6xS+UtdPS3uodnXT3mxVdUAuqml4S?= =?us-ascii?Q?65pP+JmWsicPUxGcRal2c+9+hjDYZhsbBkNXy+chLGaIG3K54BgJpesuHJeu?= =?us-ascii?Q?AfoawbTw7kjJ+xuEtkMFIrKFyTCTe3qOSgeA8HCpHXF4S2R76XMh9fMUPJU+?= =?us-ascii?Q?FnJ8GnHuq1iq+mevmmhSKgnz/Z2eRnw5uMgQ2V8/l+IZZiYqYnd9ZZI8cTvZ?= =?us-ascii?Q?FvDse30C8JIhEhQAVxCQ9RBzXbBMp10et8zVLSjY16+1EyTPSPlaaIvk8RVs?= =?us-ascii?Q?cdrND3TXNFJzlwbaWoiq0AdosqosDSPrLrceCziMsA0mYHrO9XdUrfafMlSq?= =?us-ascii?Q?xccBZhX7ORWUYTNP+PD2uBFZZFbJRelVX0M4oURcwrr87Xhjh7IovOgHVaKz?= =?us-ascii?Q?wqtQIfe+jo/uIrQeaqCvbizF6zyufwgCGH+IIOAMJY7ko6q86kyb69u9GOin?= =?us-ascii?Q?sVzRrYvcFGG1VupVQI8l6JKHxa7eaLqst8MJTfKr/oeJls07j8mwi4ekaZbx?= =?us-ascii?Q?Xulz4MSNphfwTVRCxKjHAaX8Y8fmiX+Gw5V5iS/sUgBfGvk6r9+ApzpzFSqf?= =?us-ascii?Q?CA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?fxge6SyLlGOXtcv0Otc1+2bozzPBZmfGD1Nni8wrj+m7aNn645F5fLI65cfd?= =?us-ascii?Q?/3gyy3lq+L72ZgEIGdRmkEoQL0z5LVhPQhWYkmCmTLLSoeATs/liMX1RGSPG?= =?us-ascii?Q?PgAJVNIsUGWzW1k/vpsc46/XcWFs7fSIjXj/PFCAICyea6yhF3+HKadKjAw1?= =?us-ascii?Q?hzheTw39gZy7pSKKBJI5EBdwhDlsUMHTtymT5fs+3Eqn4tJiPutqp/JuaVIU?= =?us-ascii?Q?rxRLJ/gIZdwzOzGy1uWuPYknbFK8NBu2Oh9H7UsHLWR4ygsuycjPbY7ekxfL?= =?us-ascii?Q?Lxuf1+3T/HR6RA3TMeJ15Jdt1jBNwsX9uthT5znmgotKzKjtFQDH13PfBFhX?= =?us-ascii?Q?FDS/7zw+aB9aDFbZCPA2ZdZBlBWI+IryL+V2oKEwYwquV7xgdOB3hBJ5xLLF?= =?us-ascii?Q?BzrHBgPeRuPvPbFU16s+XHSdD0UYx865kEaDLi/LXLoLu3+Ca0Rurlr1h4VI?= =?us-ascii?Q?JXr56kKWV0Fwv3jtcOi3vUI2ZG1i7mXwCLBLOA3YLY4QppFDfZ8jGtyXm3w/?= =?us-ascii?Q?cvJB9jXYiLxzwqIzUJWqqz1SHedKVFA1kr+yQoKkqBzhnwyRnVoPrabKDbRh?= =?us-ascii?Q?mCnam9d7dLqR/xrhbyA6U6kQtLI0AkwIy3+6VwNaXGBDTK8kh22k+xdT0lXC?= =?us-ascii?Q?ZdS7+193tHvEgKBU1B7PTos8i8zWImzmGAfxb22DjCoNm2fMdP02bX8Pqa2e?= =?us-ascii?Q?65Ed11prEf4dJCShRoAyiIvj1KWT4k4mN2tKalbqGIQEHv+qW5Xu0G68CkTs?= =?us-ascii?Q?oyZIgx6r+q5XLZ37AjAQ85X5WSQ/zJKsQAKdSMiJWWeWcjjGct1eZRv9yDzj?= =?us-ascii?Q?JjTZpHRMW+SuH/4FPqbvxY2g25r9bpAbCZOLQgOGu/OEACH0HET07FHjm4+q?= =?us-ascii?Q?a/bUIXAgmtW/AzZLAr9TPiAAydglwufyE6yPtl2kk/mKk46R/2dsumk04g1t?= =?us-ascii?Q?3jV22w53XGPChOLG/bm91yFZXvbrGkKuPLbzfGGHvzhgC+3CauOLJlC9jXdo?= =?us-ascii?Q?6lkMtS5QuHgR9T8ZjTxHOy64zlwoBFiGMhFDQYGbaaIgmK1itNA2o2rvTIJL?= =?us-ascii?Q?E0cbDXM5i4pSFtqCrUHPSQlIS1SY0RKyeqbmrlR0Zou/6Bf5pnlDDwovUibJ?= =?us-ascii?Q?yVpyViB6kLHPo+nEZYzk5DAWMdPWPaelarVq3ci5Cwtdk4Kp7NgVdpc0jVUX?= =?us-ascii?Q?6YtBUp7e1EpjpYOiPPA69fZVGRCdkmFDglDWDWfwBsP/vKkilQZNKzy39+z2?= =?us-ascii?Q?im7hXb6hwqdWL3YssXOE2ZhJPgMSBPkt6/OC7Gwabg8BParN2NKryZMUHhe+?= =?us-ascii?Q?cDP7K9H+j8J7E+Mt8GTUy6JBGSUmXPgR53jeNh9eJ6PhSFJJzjOURY066lQn?= =?us-ascii?Q?cvSbpWhZT5hs6+1WAHbO7YMbEtMG8uhRIEZOaDE+sRvjUL9vB6V8wYOlM8qg?= =?us-ascii?Q?KTLei2TRDkdzM4OHqSM+3YxjdYYqYO+UnYq6aW7Eg09qtRahOobLJROohngP?= =?us-ascii?Q?KGwnrVLJqfvFCXbq3sBl9VtyOYhH/MGu3cTT5+SHzn+N04lohppYhVpu9zXA?= =?us-ascii?Q?Z8bB3SbZvvC6ryc/z6Yu8mmKjCnjn2Im/hzwuZARTi9wKxmYl96S3iWhGIPj?= =?us-ascii?Q?nj0JHsyrQJCpsYCLcQeWbz8RHQ+rj5Gu8WuNkN2m1o830MsptPlqFW24hhCb?= =?us-ascii?Q?Q/WKhLseVMKo4+l2N70VzDc9IlDGpoJ+n59E6AGIODdGHGqjGOxfuNuY/rDu?= =?us-ascii?Q?DTtG97BCAYoNSZicda0t8S8hdYx5wLaJvl5nYxPsl3TPClsnYwIU?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 7fcc252a-52a2-4e59-78de-08de56993573 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:16.0319 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 0cocNALiHSXtBDyNiBeCA2OdQ+9jxihsm21H58BV1jgi40OTJb3OsWOhXGGc/zMEd/kiGj8CAQ2NLLaBTbhG+Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Add support for reserved regions using iommu_dma_get_resv_regions(). Signed-off-by: Koichiro Den --- drivers/iommu/ipmmu-vmsa.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/iommu/ipmmu-vmsa.c b/drivers/iommu/ipmmu-vmsa.c index 724d67ad5ef2..4a89d95db0f8 100644 --- a/drivers/iommu/ipmmu-vmsa.c +++ b/drivers/iommu/ipmmu-vmsa.c @@ -25,6 +25,8 @@ #include #include =20 +#include "dma-iommu.h" + #if defined(CONFIG_ARM) && !defined(CONFIG_IOMMU_DMA) #include #else @@ -888,6 +890,7 @@ static const struct iommu_ops ipmmu_ops =3D { .device_group =3D IS_ENABLED(CONFIG_ARM) && !IS_ENABLED(CONFIG_IOMMU_DMA) ? generic_device_group : generic_single_device_group, .of_xlate =3D ipmmu_of_xlate, + .get_resv_regions =3D iommu_dma_get_resv_regions, .default_domain_ops =3D &(const struct iommu_domain_ops) { .attach_dev =3D ipmmu_attach_device, .map_pages =3D ipmmu_map, --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020105.outbound.protection.outlook.com [52.101.229.105]) (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 83FAE34253B; Sun, 18 Jan 2026 13:55:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744555; cv=fail; b=rbLmt3DW1pHGnn2FOKAUpBzW6xCWetTQ/zLKzQhnHoixE9n40gfRHJ+Yrs+Rt9Ju2DbP3Pbfy8dFPTtrPVFvRK3z+S7VmD85ureN4uww1WRSwmxn3bPlz9xYMQ4EfZpN03wlijqdxLpAcCa3yDVbowtmbnVG8I7ViYRs4hbky+w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744555; c=relaxed/simple; bh=/1OXLMEl0+xEGADqX4N+3aFF3M9YFod1lihNvIzYdlo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=A5v7Mc/oXfBG/+EEXpykaXMF4Y6tV6XLIdAEMSVC78ZgEvtFuvX3IIoUidk2t05Ip3EAgRzmBjyrTNJhfu39QGPlh4EGa/Rw2sRBo/hnoE/uym1uZx9BGpoH2ReeufPV8m1ouhst32FdQAjZEchahgatRtvUapWieWEnfGo4xp0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=Hjzj4TOT; arc=fail smtp.client-ip=52.101.229.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="Hjzj4TOT" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=igAHC1k9oSMHTYmT/sGsjYeM7aLmZZ3aTMZJNFxcSU+Rqq7h1XG23Qn2K8k52E58RkOVAzpwBlS1+j8SiauK/Y+RNvZ/e+Nv7WBlVtteOZ9u6DppJadXL9mtfXzWwVFkzKxXldLyUff1pFyA7D/bqGbJlcmOPzS8ajGx2q8zcU+Y0X5q9dmL48nL78CH0qkC/CzmsfDR91mX/RDmKedUvPjoLAs2jdSpMsPBLkHf3yeqfLwvao2024PnVN8eb0YRmz+pNtwTCD/aiMueonpJsACjGObWxQHh37jQ5lVr6D3HEPkRfz0Uv4DOkaKAtMPA/Q68visTvqX26NHpbh/qPQ== 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=jP2NFmFhezNJzOBBHMSBbmnhldv6+xAK3DW3wXhut7w=; b=RtytRD5BmeEDTj0+Kkp9pnVCdVaQEahVGXAZEcrHSU6eB0RoT+4sOgD1vM2AgWKZxcLP3cBlxMuo1s6JHlAMmJ/9S5HxHrS8hc/taNX5JTS4xpqO89yrGB8mI64NljjHgELMc/jKRylhnxjPlphobweGv/qFvjzNp7Uy5Y8RphH+pZ+zez9UlNxpcLR/JUaTqDnCHacnRywsb9i73AKRAYCs/V5PT38YtR79vxa8rH6xC/QOQAQ4zkzZ2OOVIMWB3Yi3Ib259OPsQpTJYbmLtrIRr3xgHapgDpn7AjME9cV7lff2yLWOB+FhQwSV9+t0aUXjxxXo48DcTw/3ouhf0w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jP2NFmFhezNJzOBBHMSBbmnhldv6+xAK3DW3wXhut7w=; b=Hjzj4TOTpHBz2R0DbeFicn8k78pFsJntYkM2KKXG8hBPmGxUqXsJ3SsFWogpAEImIZdXxZ9kB7BrvVnV1fYNcdGtCf7at+dQNGEqBZ+atfTaGbWKyeLpeM49uvUXIAXItE4CRvW0sKeteehmx0FRL/SIJ08c+6dcgj9Hac6bAiM= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:46 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:46 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 30/38] arm64: dts: renesas: Add Spider RC/EP DTs for NTB with remote DW PCIe eDMA Date: Sun, 18 Jan 2026 22:54:32 +0900 Message-ID: <20260118135440.1958279-31-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P301CA0042.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:2be::18) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 9f125d38-3c57-4ee3-6dfd-08de569935ef X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?PlU01bIsNAp206Y+FOvadpDMU1gSCvXvO/pYk9Yn0iW1dkXj5Rt/uTc7gliR?= =?us-ascii?Q?4MW5pSdfMWUXmpdDtRwJrUnTzBRo67G4Agq+HWB3UdlVfg+b1d/Kh+SWuIi+?= =?us-ascii?Q?Mgp/vZ7DqiY7+rngr/ttUFwzq3oYkuB/yzwKxjP6oU+GiSUosIR5/jM7+3qC?= =?us-ascii?Q?76U556qvb4EL0NR9PGnln7t/ClOu1PriRJGAYESALo+84GxIdpfrU3/vFBsB?= =?us-ascii?Q?tYwk2CA9UVPG9tzHDlkXvcbqvL+eMC0q/tsnGEgSl64K222eeRUEhYLVCnZe?= =?us-ascii?Q?DwmXfmUCNbEZDp31o6iM9uV0LThho89LJpd7csMVnW3SHIZVoWGjzbXbXavH?= =?us-ascii?Q?TackNj/a5lMDKElcxrhF1ei6aomAJ3pfbsXviewDpD2XQJ3DM5C6WWoW24g1?= =?us-ascii?Q?HjO23BtOhI65Q0uDddgywwnGNKULMc+3eDpyKlYo4wjc9MGnir3hn0bTwg61?= =?us-ascii?Q?iI9fFMNuyY9VOPOiAf91z6aAdL8GUF/n7c+EGihs/F0+2acIR3P3LBnqbtWG?= =?us-ascii?Q?eDhOYCiBMWjoDQPHk+eLlSnf9qT5uf8tv4ZxrdXszLuHc98pc7JK73+mDVut?= =?us-ascii?Q?fUGR5wRcoVBNU/nVxqIwRI4fWQLNLSpS6fWXD2839LNtnWufq8ZD0v0OOHra?= =?us-ascii?Q?g5wkiHFK9jyd/Kc07f6pc1/dSoOopy3yL7aayZ0E+0sPrZ+cC1rURGqX1Bql?= =?us-ascii?Q?uUwXzoeWvMunFOL2CGnKZlCkR18fKSHUzXKX0ZVYBChEKR9b6VAtfPRUG7to?= =?us-ascii?Q?rhueB5+MMzCSRBNKSmq2Uq41zlL4fMQW4UwTBT6vBjCtDNa6VBksRweaC9+/?= =?us-ascii?Q?SsK/W3KeSLTsGpoK8+RTPMyv4ejPQNCTrbOKXM+o7ob90kfrvSxCsbVA+/Df?= =?us-ascii?Q?rnk1KaCUv5XuPZqB1xz63+j/c68ens8Le1RN3+zzbpN31eGWU3RV0ROAESUD?= =?us-ascii?Q?5PSupGd026+Ghgvt03fZU9dpQuZFT5he//Ru1lcKBL95g/9YHipH8X+8mOAK?= =?us-ascii?Q?cFnaJJ/u2Fi5qL4nXXz3PZiUcayZdFDVmH1u8ylzmPOmK+dLLbNLHAvXGUZc?= =?us-ascii?Q?JmXELiQnAJ2KSAHMNZHL1vmDNLBmBAivSVoWJX7ZpdZW/hlDGg3yYUs8ld/r?= =?us-ascii?Q?96EAXu3M//uV1tHM5xncu+UJVzL4Pnj76kf6l5wS+KJ3WT4L47Uy9W9hZ9yH?= =?us-ascii?Q?iKcufTWvfW/Td2N3O+JSDajZWXIhwydlj9nQxOH49RNTAfHL295wMd/cAtdP?= =?us-ascii?Q?Lo42Jl1OdizA201J2p66N3WRQHoxTnMpTKvtCikQR+pc05tNeakVVFZsbk5Y?= =?us-ascii?Q?nS77JhYhwTODgiEMbZxYTvOJDPXTHeSYo83fAxHg2Uk+u1NOlZtw+RZKCflz?= =?us-ascii?Q?+MqEoA5IxoLGQ9bcNqXPb9kv0lT8D7wkHnH9+XNkvtWpFsK1PJeTUu5z3IrU?= =?us-ascii?Q?SIhLWmayaJdhm5S0M0RddPcXRQnkozuBX9lvE4cP2Flkl53Wc4POQcvfzNl2?= =?us-ascii?Q?kD7A/mAaVDkI3q8QddD9RPlJuXYnCILgKDKI94yfvet/5nPpajTJ2xtl1KZe?= =?us-ascii?Q?U+QREz6nGjD3MmSgu72uNG+SVIjvh8TJ99s+PMgiLt4fh4ZszM+bkzU/JZ2s?= =?us-ascii?Q?iA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?pOFxw9CGWutXdYLPTlIGCS+QgdOtM5Ps0GfLa/gIp7AsXE6L1VKXDTmWHJ6w?= =?us-ascii?Q?VO5QdC/jUSE1F43TIZXbZaRW38CVs3evwgeKvJh3e9LvKAl0BDHVKgve26py?= =?us-ascii?Q?RPxfb93qp158SOfccjp67Zei9YgmH+X6VQFsXFJTu5SnzLdigldPcsOrVFkv?= =?us-ascii?Q?3ZXJf2ugkN1kV6yZvEJTMqxz2cFvsXSTYUfADKKgE7Cj0eXNfP+yUidt3wil?= =?us-ascii?Q?2dz36n//F3mqO47PP7rHzEjDRjyf3i0ZlsWT6e6v4ot/P8noCDLv4lPnMb+V?= =?us-ascii?Q?lhvdXRkgNDYIk+avn6pLXxCHK+cpM1JQRIGBTcg56+Y5F0qJgIgybdMoTB+Z?= =?us-ascii?Q?/UxziIg4u+UxeGTx98ohQv1zgOiJLeKLy/+EK6JFnXybf2w2/AKs26vPlDgD?= =?us-ascii?Q?tOHrvNrK/DMUI1//4his0halPk8odtF/vS3kkNtt5+AYqH1+5E43v41YMGK7?= =?us-ascii?Q?5qP+34MHAYB7sRzAAuDsEnw/7vCvlVBTJurjZjv8/HfbEH+x5XkiWWDAqDdu?= =?us-ascii?Q?jgH/aGzlMOAU2TOKeMhBG0LqeHU0kYetN3AbmwXT3zueV5p5dgSZYtfeIgTN?= =?us-ascii?Q?1pScRwIAZod1wEhTg2ZLTVQroZNFU5IXeoeA8/uruZYEpdlIzV0TwBN91qQh?= =?us-ascii?Q?ZL4c9Pv4JW6qIZwhi+013UrcU1o+u5gSnvdJsR1NTOAWKp7P9lmthBT6SQkb?= =?us-ascii?Q?K8j+HisEJsHIWfwCUJO29Y7EuSxFGsudr76DNr2j+mZ+mC5FoGmT/9Ky5JTk?= =?us-ascii?Q?/FHEcEVbY5Zhl/J1rKtWQGADn6Qob5dbSUfgm2cOvJwlUMlWX+vdwq0CEunU?= =?us-ascii?Q?VySZXaYyouLr4hV3gDTIdSG8viqZjBpWX7A4MbXQXLweEk6s9WQMIMoufll1?= =?us-ascii?Q?Fnt8xj4268xALZokxElmeLhY3jOh3P5bRMFXR0Kh1yucWfW2VDZf4GlOXCwg?= =?us-ascii?Q?JGbuVm4NJ5mtkOetxm4o3p9x3TwqW+afDz4K4xBGFLXTobq6SdP9buFt9O1p?= =?us-ascii?Q?3lUdYmpJZbmpdhW3lKxv0tn4rXe3jrkqfn4+USQTl+u+pEqxEtLyIFzv85uB?= =?us-ascii?Q?PhHBUEXrgGUp+8oXgaYDhQMDcYd8qHAo5X4AL8xmDIpF0pQKVCDLd4obevuX?= =?us-ascii?Q?YwAuaQHR9/xdB3rCsFfchKu5U6DewZwHDmN18emILxc5d7z/YMQaXq3KsB//?= =?us-ascii?Q?NpnX5mQwB85F2TRZM+kxP94cfj0lKTBDgm6jNSVtmyKoaQBIOvHnvKG858AO?= =?us-ascii?Q?jU1dt4XBX2bcszwtNq0DwEFTqCV6ooxZshgE8OK0/5luHeKaddiVEVhiFst3?= =?us-ascii?Q?tmxlyURfkjMEsWeRvyjOZvbLIuzGeEDfXmV6zJfRoYZb2LrdOC0bp9G9rKLF?= =?us-ascii?Q?IX77hpAe2vGMSZqMF078SWwmORa4v22i3AAvnIsRnrIjy7s6ay/NMMi90L3C?= =?us-ascii?Q?WW3dn3139EhKrs7lM2N0fH7NR+f3k+hFzAgej7PKnDItoNZx4Q1XyPv6qP/u?= =?us-ascii?Q?6RfzS4v1ibpZoJPQsraEGYl6bzuj1Z1wydrZG0bnmDgizVM/Ze4Rms2xmrs0?= =?us-ascii?Q?F+jzbuJ67+3wI6w6bSoOzGEBSm4uk8un22YJzSg0k0Ql9QWMDhu7XZcodGG+?= =?us-ascii?Q?2nRAbmMwP0EyhMTc54GQMsNsS8Cpp+C+4BHUHagj2L1198z/J45zYoDf5HpF?= =?us-ascii?Q?FRlvpwl2zdyx9WOCF7cNodz6P7P7Drv6KZ0kmOkTnkz/coPJmTn8L/osmRrb?= =?us-ascii?Q?xLsaJi1QdKvlP9MepxvpX3AgYpGajuJ+wmMtm+G664oHBMNf6q8s?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 9f125d38-3c57-4ee3-6dfd-08de569935ef X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:16.8453 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: kbDbNljZso+16ZBH6MUHCXofm+Ts+7vaK7NpBNncekkBRVkpi5tEjT/PEqAlWMrlEe3tuFhzwZVfiVhhwZVeoA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Add dedicated DTs for the Spider CPU+BreakOut boards when used in PCIe RC/EP mode with DW PCIe eDMA based NTB transport. * r8a779f0-spider-rc.dts describes the board in RC mode. It reserves 4 MiB of IOVA starting at 0xfe000000, which on this SoC is the ECAM/Config aperture of the PCIe host bridge. In stress testing with the remote eDMA, allowing generic DMA mappings to occupy this range led to immediate instability. The exact mechanism is under investigation, but reserving the range avoids the issue in practice. * r8a779f0-spider-ep.dts describes the board in EP mode. The RC interface is disabled and the EP interface is enabled. IPMMU usage matches the RC case. The base r8a779f0-spider.dts is intentionally left unchanged and continues to describe the default RC-only board configuration. Signed-off-by: Koichiro Den --- arch/arm64/boot/dts/renesas/Makefile | 2 + .../boot/dts/renesas/r8a779f0-spider-ep.dts | 37 +++++++++++++ .../boot/dts/renesas/r8a779f0-spider-rc.dts | 52 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 arch/arm64/boot/dts/renesas/r8a779f0-spider-ep.dts create mode 100644 arch/arm64/boot/dts/renesas/r8a779f0-spider-rc.dts diff --git a/arch/arm64/boot/dts/renesas/Makefile b/arch/arm64/boot/dts/ren= esas/Makefile index 1fab1b50f20e..e8d312be515b 100644 --- a/arch/arm64/boot/dts/renesas/Makefile +++ b/arch/arm64/boot/dts/renesas/Makefile @@ -82,6 +82,8 @@ dtb-$(CONFIG_ARCH_R8A77995) +=3D r8a77995-draak-panel-aa1= 04xd12.dtb dtb-$(CONFIG_ARCH_R8A779A0) +=3D r8a779a0-falcon.dtb =20 dtb-$(CONFIG_ARCH_R8A779F0) +=3D r8a779f0-spider.dtb +dtb-$(CONFIG_ARCH_R8A779F0) +=3D r8a779f0-spider-ep.dtb +dtb-$(CONFIG_ARCH_R8A779F0) +=3D r8a779f0-spider-rc.dtb dtb-$(CONFIG_ARCH_R8A779F0) +=3D r8a779f4-s4sk.dtb =20 dtb-$(CONFIG_ARCH_R8A779G0) +=3D r8a779g0-white-hawk.dtb diff --git a/arch/arm64/boot/dts/renesas/r8a779f0-spider-ep.dts b/arch/arm6= 4/boot/dts/renesas/r8a779f0-spider-ep.dts new file mode 100644 index 000000000000..6753f8497d0d --- /dev/null +++ b/arch/arm64/boot/dts/renesas/r8a779f0-spider-ep.dts @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: (GPL-2.0 OR MIT) +/* + * Device Tree Source for the Spider CPU and BreakOut boards + * (PCIe EP mode with DW PCIe eDMA used for NTB transport) + * + * Based on the base r8a779f0-spider.dts. + * + * Copyright (C) 2025 Renesas Electronics Corp. + */ + +/dts-v1/; +#include "r8a779f0-spider-cpu.dtsi" +#include "r8a779f0-spider-ethernet.dtsi" + +/ { + model =3D "Renesas Spider CPU and Breakout boards based on r8a779f0"; + compatible =3D "renesas,spider-breakout", "renesas,spider-cpu", + "renesas,r8a779f0"; +}; + +&i2c4 { + eeprom@51 { + compatible =3D "rohm,br24g01", "atmel,24c01"; + label =3D "breakout-board"; + reg =3D <0x51>; + pagesize =3D <8>; + }; +}; + +&pciec0 { + status =3D "disabled"; +}; + +&pciec0_ep { + iommus =3D <&ipmmu_hc 32>; + status =3D "okay"; +}; diff --git a/arch/arm64/boot/dts/renesas/r8a779f0-spider-rc.dts b/arch/arm6= 4/boot/dts/renesas/r8a779f0-spider-rc.dts new file mode 100644 index 000000000000..c7112862e1e1 --- /dev/null +++ b/arch/arm64/boot/dts/renesas/r8a779f0-spider-rc.dts @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: (GPL-2.0 OR MIT) +/* + * Device Tree Source for the Spider CPU and BreakOut boards + * (PCIe RC mode with remote DW PCIe eDMA used for NTB transport) + * + * Based on the base r8a779f0-spider.dts. + * + * Copyright (C) 2025 Renesas Electronics Corp. + */ + +/dts-v1/; +#include "r8a779f0-spider-cpu.dtsi" +#include "r8a779f0-spider-ethernet.dtsi" + +/ { + model =3D "Renesas Spider CPU and Breakout boards based on r8a779f0"; + compatible =3D "renesas,spider-breakout", "renesas,spider-cpu", + "renesas,r8a779f0"; + + reserved-memory { + #address-cells =3D <2>; + #size-cells =3D <2>; + ranges; + + /* + * Reserve 4 MiB of IOVA starting at 0xfe000000. Allowing DMA + * writes whose DAR (destination IOVA) falls numerically inside + * the ECAM/config window has been observed to trigger + * controller misbehavior. + */ + pciec0_iova_resv: pcie-iova-resv { + iommu-addresses =3D <&pciec0 0x0 0xfe000000 0x0 0x00400000>; + }; + }; +}; + +&i2c4 { + eeprom@51 { + compatible =3D "rohm,br24g01", "atmel,24c01"; + label =3D "breakout-board"; + reg =3D <0x51>; + pagesize =3D <8>; + }; +}; + +&pciec0 { + iommus =3D <&ipmmu_hc 32>; + iommu-map =3D <0 &ipmmu_hc 32 1>; + iommu-map-mask =3D <0>; + + memory-region =3D <&pciec0_iova_resv>; +}; --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021122.outbound.protection.outlook.com [40.107.74.122]) (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 285BA33C18A; Sun, 18 Jan 2026 13:55:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744556; cv=fail; b=kxjrH10wUrHeaSv1amzH/2vaoplwpkzbPxsgFbMDIWep0N5rsxq2CPm9dX5iSvViwpkej/MpDJklAZrGwRWUjSBi8msHcu4kU4gKJroPmGya5NiBtZbCO+VX2F7aYS6gegB76v9NOBMHQJW1QdZa8/k/us0SzLzUIgbdpUDkP2M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744556; c=relaxed/simple; bh=/3BEllXzpjc8B0U9/JLdJ/vM9yD+tyj/xJqZKmc0JZ8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=qmxXiGgrdBqZTjqAav2F9C6PcgjOc/99DlpgOdvkLT10gxMzx20nrx2l8880mv4jNbSBaukooT55Lltkru2RXIrEPKk1neZQXttGrwpLW0FCpwppQprLrLS56hV/OZdlydDj3sCAOJhnZ/bf/lVu8zVOduF8tGM/SOStVk74RPc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=SIplYjZI; arc=fail smtp.client-ip=40.107.74.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="SIplYjZI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ItYcw6zCqZTpq9qm112w7TpuE9iD/BtDf5HyNpRXt3wLuch3qngChHKckHJ8Kbu6ku6Nqqyl79oVHS9VEH8eT0nf/GfY5CxvAsCkyI+aYCHP7Z/zHw/OoEo/Rfv/itu9AKCBz/DOJK/4p0xmN7QPaiOGw/NQEd50wmLLnaIHyxNM2jZYb/CG/jbBVzshbDul/H3/6GBh2tgxMwR0Y7tSegoCfhVuD7PAgeCQpoApul8/pNAcsYeBr2MvIPyipnnhtMuA7IGWsV268iHw5yyOi2jQYsdPB0dM7gHScGFAPlCH7wxehOmR/KvodpLl8SCfRtsIiPm8J4yfQDVQp/AwNQ== 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=4hMdAVVGJT+l4QJS2EZy8lvG+0HCCSue+ohCs2s/gxE=; b=EYoa8AKUrZkjhJmgjeJ3SzlqrI+OdppTMlGvBsEpzsJ0+DomiIy3N4KvNkvV0ADnT5BG0qrrAgP58+1gp6EnfQSNZdz4dVj0SU0+MZXeUIIBVhhM+F3Lqh4+hCsAR62vBIXHuKvGbRWerR/JxVUGOpbxvfcoIbFJjS1pX3dB8WwwW7JOEsx57pqPjhxpxRQ35zaRwJQGJlU5eQa0J3hHj2gG5oPGNn5vjIdwIbPkrVe23TEWKY8ts0MDUugniHM8ul6oDToIYNDiXaYna5TUD8Yphma+OPnuoLlHjj5lD5LbZGLacwk+gPOfN3HfZ2Z7ZQAjlRtrKICxYmvrRfLKAg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4hMdAVVGJT+l4QJS2EZy8lvG+0HCCSue+ohCs2s/gxE=; b=SIplYjZIfRe9/0P1NwL4qUopFgo+b9N0q5UY9kqJ27Ir57/K9qjlauXF+8FufKhemX1WQq3zoMH7IlXK60bZEA51t3xgjlevfjuioh/SHUaMuqiGiHikiMkUjyucMEKX162zz6utu1BtBcQenBGO+HAu5FROfosS+JBIf0+coNU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:47 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:47 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 31/38] NTB: epf: Add per-SoC quirk to cap MRRS for DWC eDMA (128B for R-Car) Date: Sun, 18 Jan 2026 22:54:33 +0900 Message-ID: <20260118135440.1958279-32-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P301CA0036.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:2be::19) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: a0cafa8f-3284-4bfa-71d0-08de56993660 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020|7053199007; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?nMrdVbIICOg2EFIO3NQe2y+a3zC2UTdQgWcCokiy7wbl+xE1dV66npFfcOD2?= =?us-ascii?Q?eSHJepx3TEOEh4YoLODycYvyc6mMOoZ1S8jRn7emrkw6YaFfgHHWSV7NQNZO?= =?us-ascii?Q?nOjOjHKSL+q4oN0czzus6BK/84TpDj5TeOUvM9cQk2Y4ZoXlttqUQJgstJu+?= =?us-ascii?Q?Dt3YDuiEoDp1G//KXBYU0XyObHWmSYKCAQ7KW3bGOzHOKmeVfaSqvEn5dbwR?= =?us-ascii?Q?WwCO3/A8yHuVzkohNaT0k+OWYbRCxqKSmrBGkJ3CiTu7n2jYvn+HWVDxfoYC?= =?us-ascii?Q?FWmnWIMO3FM/C7kwpwb+jxd2MPgdrWtWyr4gePPTWsvhSmBhc3SDQf11PRi+?= =?us-ascii?Q?mYmFXi/ZoXUrIAIB0P2CBum5VawwrcrTh2v7Jc+GkT/jKdudn3wd5qkLHK8V?= =?us-ascii?Q?A4YGIbuoeJrw25cYZfiJZKko9wEcJ4r3i71EnOLhaz0FR/4GMQqamVcAjC1F?= =?us-ascii?Q?L5psZD+o7wNQPzEWzKvDBYuIz5iPOT03YNpFF8OrKxqHLNieC/pI4DDmad9Z?= =?us-ascii?Q?zbJW7dvcq9fR02ITlWn+hpVGjR+EGJAoe1WRnh2W03sfzt+XVF3ZlUaAS3Wy?= =?us-ascii?Q?0NWIKjQvecJz5fidQGMhe7kaSCt4XR5jBWIrQeNG0nhtsYg+7sJC5W8qOsX7?= =?us-ascii?Q?cGMBTuFFLduGv+++F2njn4VRSvXrP25nLE1BAmAyW9PX1XVHbnXlYpuTprx6?= =?us-ascii?Q?vUoe1bHJBG6roC4tJFcp2JfkWMjdOfZW1zqoJ0ZPpNECdn8zoGjgwZb/FUht?= =?us-ascii?Q?XITb5xR9pPcuj7Z7NypoLt8GjraWMtV2GDyXKCG5quLKMQuvslr1rLmgoVdv?= =?us-ascii?Q?FfxS//vT/VkzUnt2lnrPY/vuBc2KUTnPAVB73/w2WhMUbt7G5mdIC5IEmr/K?= =?us-ascii?Q?gU0nqZsXB2Ff8eL9nwyCrtGhaY1Ql9TlweddI1gt57tlS5h078udywjbxbbt?= =?us-ascii?Q?sr3Iwm5Y6ZdIZlD91mPrqV3543kwWJT4HQ67sNYoPSLo3qlPDJ1dA+JR+eAu?= =?us-ascii?Q?MjF+bRJmFD7fZT3xRmj4wF5Jgyi3QHkzLqd5+er43f34Ez90mVZDI21+r4TG?= =?us-ascii?Q?XcFa2hUVimFhysHOXrgZrPmBWUwq+QGOaGpxEzR7J9qbpkjgIyEv95R/ulFZ?= =?us-ascii?Q?xd031sxMmIMPf5Al4mSq+QDa0ZR8Bt1RE9NLb3vLawaVO4/XgcvtDtCRLJNu?= =?us-ascii?Q?PyYmuT+fEd75pb8sc1SCZOGD3ggkF1q967yrrOAXGNEJ1F+D/1fDeQHlXyyP?= =?us-ascii?Q?2M/Zj2CwTP4owphJuqjS9u//S7p/l4OMHk8zJa/WDQmbulbUsBlsxoRfm3lg?= =?us-ascii?Q?tOa7qhAP0uvNQEL5u2G3z8k2MWSMFzt+UzKPtFSyHN4TTV+HZUaApMjA5lan?= =?us-ascii?Q?U9Ayg29xF055Gse9jBXzqfzBF2a0kYIJE7Wlr6dXd7F364kRTy/klpUAkVib?= =?us-ascii?Q?bcsWt2HtufhVhSuh04X967EM8Jn85aLQORTnYre4AKT3KEh1J0vHDnlnKCZD?= =?us-ascii?Q?YWRyg+rFt3QWawAHatNJ3ctWO+7eYMRkbRPynFbUYtoVCfpnoZRr1RbVwNMJ?= =?us-ascii?Q?m2Rs1nxN2brQhbKto9yeT2OufUlCqRqe8AP7NEyMp2B0Xu2YhYXT34WpaqR+?= =?us-ascii?Q?Ug=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020)(7053199007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?kbsEqRsCub8zfIEdp7AvPgIwIixesNoOzkGsmD53uyL75GyI27lXvc6AikVc?= =?us-ascii?Q?D0C40ZuEHpqtIwX2Fbi77FGx7qGNaQeAEw8VtUCfA0YK/gIKM6vWFcNzBzLW?= =?us-ascii?Q?Y7+xGYgVdSBXcI669tzA/njR2oZ26BpE/EuAS8GJvlFXUEM4OOMCz6LV5QvZ?= =?us-ascii?Q?XzIUrhJQYy5OFkZJsCpBphQA/RcdUENc0lMhvOuQcjDCJLS5ry46gVw1fuW+?= =?us-ascii?Q?RIFo4+DbJW5zIaFVx1JuqS+GUnhrHhquXPkH1tJhQ1tnSubKGTOVQaF9cd0Z?= =?us-ascii?Q?AJUMCISr5tUHQPVqP+ovcVvhG7zy0Yqf7K6+s+yCwZ7kEdixAEhq10cfkryA?= =?us-ascii?Q?I9VbpQZToFALBMT4xF3iBkS4ZRQg1bCv2bqZ4delHHvDfFM1Bp6t3MYkt47C?= =?us-ascii?Q?HhwapsLVJAiMuePswRDQZ6Wv40C7GTn+Q70aTN9iawnODB5BFVyC0qI4G8hp?= =?us-ascii?Q?Ga2XEK0OmJ+RvCgdGM80zWO3uBcMLCLNQOYAVYpeanRufA2H1RemAfWH94VP?= =?us-ascii?Q?j3papbox6D+QuzCRvE4VkQJrBHu1F23pe2GMi4fmRoC/iHPZa+vdyT4rhUXN?= =?us-ascii?Q?+e0MfmyFyQmsVaDFrA1dwlsAYcgDuCLnnNJXnr3UVrmeIxCp1+f/I2JHMMR+?= =?us-ascii?Q?cA9AQGOCsOZuNq2KxOnsPdSuXzu9XUCipjYvSkS+LnoFrd3wt0jsETBA8C/Z?= =?us-ascii?Q?79VALbIpYSEvF/WW/M0VH+RYQx//hQhTbMogPi3sP/aPvqsDYiY+OA96NIex?= =?us-ascii?Q?CkIxJJI7L8FaYO9y62fKBDOwFmybHeP3ka/h4HfaiWA7mcRIpu5oxvLhgYIb?= =?us-ascii?Q?kRjSlmNIcnd7JB4YrmdgRq/HK5u2OinxEN64d7kwZnwK0f7AO8FlX4+AbZ6O?= =?us-ascii?Q?yb+EwNMga7PPaOHjkybAmnO0NbdrJf1UJlMpLDHPKyNrW3N/My2Ru2ShjJGf?= =?us-ascii?Q?EBqDPufVNI+ETZZwqXGOykDCktsSRLgCevm1CHLihESHTL/8FXm9V4FlIGmN?= =?us-ascii?Q?D+2ny+NR0u1HOVUH0a2j4NEnFFNj70t89Y9hQMnypVk6jJpr+ifk0BrDrjXE?= =?us-ascii?Q?QJQ9icY43giYV0PTBtFReMoKurxqjEy7G2kyoB3pP23h4aU5kB/OsQD30Ppa?= =?us-ascii?Q?P8xu+k+tDRWQZ/xmtTrXTDEyD17hL9BpU3JIS9oMM6WiZJnZp35ZnbIqPS0D?= =?us-ascii?Q?jGE4WYQEtXUXdIaYaQtiqbKO6vhd32aGjXZzKYxYSuHRrmTvEP6EL1FL3ST4?= =?us-ascii?Q?NFpdlJtqrE03wypi3qBNdi8okWjC0Qb1Je/paa1mz+UGkrQCcl35yT96DgQM?= =?us-ascii?Q?rtBrUT3dP0vgiXMSIzYGlMfYXLbBBaK+CE5VPGg9OuK2saYR2+9cozprX6/g?= =?us-ascii?Q?78iPx+R0gFGCRKUrjQLOJPD78Hi6335WCbFjUGainykukDq2MZ6VGvqSAOrA?= =?us-ascii?Q?8R8E8LcVANBEG920z8H2+wahDm6Zd9o1S6pBNO0O7RWTd90+XndxprDyZDub?= =?us-ascii?Q?tlqMCTSWaoCjcV9KzjONjLkTxFHAzHXRiF1bXxtic5q6oBVkqcKMfloyOtKU?= =?us-ascii?Q?z8Ica8d0ZJYBcm7qf11uMHWKI+U1Zsj6Tbvl7L1hSCJv17MhAPsnwqES5+3E?= =?us-ascii?Q?qH+3vH7iBS8QE2TeAb3hVWY2qHhr+K8AOCjPC3afW+NA/FUAiV6GIpiSfFpe?= =?us-ascii?Q?efz/KY9Vua5DvvZuWUzqNZaDjDLQZHDkk7GQBadn6cp/0ZPas/cLjyhYDHwk?= =?us-ascii?Q?o3YJ790TX5cEIsyFgkpNCufWGPg9NZ6q/kp06Hm/FkHSO937lsh8?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: a0cafa8f-3284-4bfa-71d0-08de56993660 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:17.5846 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: oBXYtNJDeuJIB+ebdXhEbc61NVohxRkhWafNefaz2TQqA88yosdMqRvsZJdBF91fALS+lU2QXr06uVO5dZRR6g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Some R-Car platforms using Synopsys DesignWare PCIe with the integrated eDMA exhibit reproducible payload corruption in RC->EP remote DMA read traffic whenever the endpoint issues 256-byte Memory Read (MRd) TLPs. The eDMA injects multiple MRd requests of size less than or equal to min(MRRS, MPS), so constraining the endpoint's MRd request size removes 256-byte MRd TLPs and avoids the issue. This change adds a per-SoC knob in the ntb_hw_epf driver and sets MRRS=3D128 on R-Car. We intentionally do not change the endpoint's MPS. Per PCIe Base Specification, MPS limits the payload size of TLPs with data transmitted by the Function, while Max_Read_Request_Size limits the size of read requests produced by the Function as a Requester. Limiting MRRS is sufficient to constrain MRd Byte Count, while lowering MPS would also throttle unrelated traffic (e.g. endpoint-originated Posted Writes and Completions with Data) without being necessary for this fix. This quirk is scoped to the affected endpoint only and can be removed once the underlying issue is resolved in the controller/IP. Reviewed-by: Frank Li Signed-off-by: Koichiro Den --- drivers/ntb/hw/epf/ntb_hw_epf.c | 66 +++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/drivers/ntb/hw/epf/ntb_hw_epf.c b/drivers/ntb/hw/epf/ntb_hw_ep= f.c index c37ede4063dc..2cefe46d2520 100644 --- a/drivers/ntb/hw/epf/ntb_hw_epf.c +++ b/drivers/ntb/hw/epf/ntb_hw_epf.c @@ -79,6 +79,12 @@ enum epf_ntb_bar { NTB_BAR_NUM, }; =20 +struct ntb_epf_soc_data { + const enum pci_barno *barno_map; + /* non-zero to override MRRS for this SoC */ + int force_mrrs; +}; + #define NTB_EPF_MAX_MW_COUNT (NTB_BAR_NUM - BAR_MW1) =20 struct ntb_epf_dev { @@ -640,11 +646,12 @@ static int ntb_epf_init_dev(struct ntb_epf_dev *ndev) } =20 static int ntb_epf_init_pci(struct ntb_epf_dev *ndev, - struct pci_dev *pdev) + struct pci_dev *pdev, + const struct ntb_epf_soc_data *soc) { struct device *dev =3D ndev->dev; size_t spad_sz, spad_off; - int ret; + int ret, cur; =20 pci_set_drvdata(pdev, ndev); =20 @@ -662,6 +669,17 @@ static int ntb_epf_init_pci(struct ntb_epf_dev *ndev, =20 pci_set_master(pdev); =20 + if (soc && pci_is_pcie(pdev) && soc->force_mrrs) { + cur =3D pcie_get_readrq(pdev); + ret =3D pcie_set_readrq(pdev, soc->force_mrrs); + if (ret) + dev_warn(&pdev->dev, "failed to set MRRS=3D%d: %d\n", + soc->force_mrrs, ret); + else + dev_info(&pdev->dev, "capped MRRS: %d->%d for ntb-epf\n", + cur, soc->force_mrrs); + } + ret =3D dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)); if (ret) { ret =3D dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32)); @@ -737,6 +755,7 @@ static void ntb_epf_cleanup_isr(struct ntb_epf_dev *nde= v) static int ntb_epf_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { + const struct ntb_epf_soc_data *soc =3D (const void *)id->driver_data; struct device *dev =3D &pdev->dev; struct ntb_epf_dev *ndev; int ret; @@ -748,16 +767,16 @@ static int ntb_epf_pci_probe(struct pci_dev *pdev, if (!ndev) return -ENOMEM; =20 - ndev->barno_map =3D (const enum pci_barno *)id->driver_data; - if (!ndev->barno_map) + if (!soc || !soc->barno_map) return -EINVAL; =20 + ndev->barno_map =3D soc->barno_map; ndev->dev =3D dev; =20 ntb_epf_init_struct(ndev, pdev); mutex_init(&ndev->cmd_lock); =20 - ret =3D ntb_epf_init_pci(ndev, pdev); + ret =3D ntb_epf_init_pci(ndev, pdev, soc); if (ret) { dev_err(dev, "Failed to init PCI\n"); return ret; @@ -829,21 +848,52 @@ static const enum pci_barno rcar_barno[NTB_BAR_NUM] = =3D { [BAR_MW4] =3D NO_BAR, }; =20 +static const struct ntb_epf_soc_data j721e_soc =3D { + .barno_map =3D j721e_map, +}; + +static const struct ntb_epf_soc_data mx8_soc =3D { + .barno_map =3D mx8_map, +}; + +static const struct ntb_epf_soc_data rcar_soc =3D { + .barno_map =3D rcar_barno, + /* + * On some R-Car platforms using the Synopsys DWC PCIe + eDMA we + * observe data corruption on RC->EP Remote DMA Read paths whenever + * the EP issues large MRd requests. The corruption consistently + * hits the tail of each 256-byte segment (e.g. offsets + * 0x00E0..0x00FF within a 256B block, and again at 0x01E0..0x01FF + * for larger transfers). + * + * The DMA injects multiple MRd requests of size less than or equal + * to the min(MRRS, MPS) into the outbound request path. By + * lowering MRRS to 128 we prevent 256B MRd TLPs from being + * generated and avoid the issue on the affected hardware. We + * intentionally keep MPS unchanged and scope this quirk to this + * endpoint to avoid impacting unrelated devices. + * + * Remove this once the issue is resolved (maybe controller/IP + * level) or a more preferable workaround becomes available. + */ + .force_mrrs =3D 128, +}; + static const struct pci_device_id ntb_epf_pci_tbl[] =3D { { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721E), .class =3D PCI_CLASS_MEMORY_RAM << 8, .class_mask =3D 0xffff00, - .driver_data =3D (kernel_ulong_t)j721e_map, + .driver_data =3D (kernel_ulong_t)&j721e_soc, }, { PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x0809), .class =3D PCI_CLASS_MEMORY_RAM << 8, .class_mask =3D 0xffff00, - .driver_data =3D (kernel_ulong_t)mx8_map, + .driver_data =3D (kernel_ulong_t)&mx8_soc, }, { PCI_DEVICE(PCI_VENDOR_ID_RENESAS, 0x0030), .class =3D PCI_CLASS_MEMORY_RAM << 8, .class_mask =3D 0xffff00, - .driver_data =3D (kernel_ulong_t)rcar_barno, + .driver_data =3D (kernel_ulong_t)&rcar_soc, }, { }, }; --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020105.outbound.protection.outlook.com [52.101.229.105]) (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 61D1032ABC1; Sun, 18 Jan 2026 13:55:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744558; cv=fail; b=hX8zdOf1z9jh/RF080dhL9A6Zdkwt3yLmNj6zDIosSWj5ChkRRr+ljzijOtDKLwYNOBnEiiB5EzrFpf8krCEv5JlCL4k7XIRwfQ+6+fWlpRBvEhuHd3lE3Tx0iZNURhK8XtiCggRQeNGZPBlB3ZcSUS8MW3qoEgE5KNTeT0DuyM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744558; c=relaxed/simple; bh=cZ2JJkfKFpXl/G0PAJ10K0P1Awpv3h068rBss1hejWU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=AFv8JqrHGCAJQkfdCy/uz6E7kJWGqc/hQpCG7A9ONq3QNpib5lVWGuwRZWsZv2lSWKmzRFn1qWP9wnuOa/D8YlqQu+Y5QFY1st52Uhti1XcXTn6gPDhC10QwwCbBto6sY9Q1ROa7d4Od0yrngMF3II5GrPn5CGtTBMbjUUVMndI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=pgYFtkcf; arc=fail smtp.client-ip=52.101.229.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="pgYFtkcf" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kqpo2yALyw6nB1C7MYozanfSPfx7iCzvb8+nhZrSAyy3wZpZm1KKlWnT7KbCxbsfv1uUQ4QqGc2oavXZeKuxlZHAnV5cX5dmyHx4Cwus800L596PhIAUYLP4Oj413rgcTLX7fDnWfj9pBJJlW8WnJIkC0Ji2Pq6LCmpikDLB58LYuIs8OcCXnEpi7sMAat01XX93yq2g7RsaC/cq34uLJ9/rHoPftc0MTePuEmSrYBFhhcSNe22Opn0mLZDFuDJpZmD3Bnl7n93R90heFcKvEmbNKVOeWK+ISn7o9HgMCJx1hoIn2Q85yGQDTZo6i/flIqDbUFBamZoZijcJOPI9yQ== 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=SPQC6GKHCO0g1ghaGvFsv/Elck1FNfi9IH8YOyIzrP0=; b=N2dqAH/65EjbGnIDqNMyEr5Mf/yo12OoIyE2D9NrzRPTXxLE9woCrKPuRKIRoPCdtzZVKXFOp339UOzQXswZm/7Hhy05DAg/TYoOkLJFSvg8jOxIHxplId90Uo+uxF/R6oOBxp+cajE7iycIoYFpAG+pGhE67F/TDmD3vwdHaXJPJk7VBEJpGQDV/MsLIoALo29nj8O4zFzZ66Uhz/wQMykvy8f5Q3xn/zJZ9PYN/a2Br8JsqHlRgFEavRytwA3ocTkRLFnilG9zuhIF/a1j4KrUpirl0vABKphLC4t7ZNeqblUjPa0mCfJnMugTvT/bqAVZqHeNeV/O0gFxqDR8rw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=SPQC6GKHCO0g1ghaGvFsv/Elck1FNfi9IH8YOyIzrP0=; b=pgYFtkcfyGJ203hz1BmfT/vfXL9kshAl6M3y0uXA7I7cw4VA9VYA+dONoq6n7QOUovsdT/PZmdN8I3RxHszIGkfLi23vTlXFVT7qsukSifEb7DiCTfzq2sBpdb2pldwUpG8wJPNFmb7mzkXZylkdt7rd4xj/QmElN+mY6I76lpk= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:47 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:47 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 32/38] NTB: epf: Add an additional memory window (MW2) barno mapping on Renesas R-Car Date: Sun, 18 Jan 2026 22:54:34 +0900 Message-ID: <20260118135440.1958279-33-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P301CA0091.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:37a::14) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: e71d1154-427b-4810-cc71-08de569936e3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?D5PcQXJUgJajNPYBUEwwVsdlXq1zLwvoftsERsW5E2eQjP9S0SvtaxNoPT+Z?= =?us-ascii?Q?+GQYF9DEdVWSkxdwr2D6mpwJOe4MNc869Cei06apELljhp3FDQBh0/n4Hl0T?= =?us-ascii?Q?nX/MrYck8V2eroBx8cj4wluBiwBJQ41EgeHw+a7IMJiEU2tVPP6yY8dy/KtN?= =?us-ascii?Q?7nU/CCXs4q1t/TcvERaQsSNfQIsodbwRmTBH9JYZufja8PN89uSWvSEwa0xS?= =?us-ascii?Q?uaKWzDWc+aeFkunz6jmdb+HbDKng1MMNMdDcH8HEvHUc14wqN4lyhFNhCS1g?= =?us-ascii?Q?rq5JwvxScD7FS1e9yF2pFE71GtLs6I+/OPcTH+8tCKDXKijiaeZ92zt49Hc/?= =?us-ascii?Q?6ujQTJykcgUU/3IthcRNg5uAEiyaYoNiRwsCAauU1jDe8cohKFQdDrT+5afH?= =?us-ascii?Q?B6D3jlchoyMXeae9tr4V16vXPdOQ+yV4NkYIVRcYMJtIf+UnQOFb64Lj4mOk?= =?us-ascii?Q?XibHzciIRbAA8ocJ9qwMImdrE1a7qilNJ+zELJvgt1F8FgelWWa2uZUbyP2l?= =?us-ascii?Q?N32PKltwHy7T8CtDVcw/slkbNryT/EzweHdwT5sjgbp5RClQeGdMWQoLO05x?= =?us-ascii?Q?4FXeGbjXjdvmC3JJoqVi6kkUsfAgaUUOokf2jIWNHSKj/njRl4+bitpvT9qJ?= =?us-ascii?Q?geS4Ar++tZ2PRLpTynmR4IxTuN7ifvJ+jnxiaY+BI5fpLg/fBU7MglmQZDzj?= =?us-ascii?Q?Utylmk7RIHEA1jCTv57L8VRjlCl2ek/G4DdXIMMeUn6cMjmi/j3Qv147Y6pz?= =?us-ascii?Q?oIBcvfd5Mpj3uKJ403uf1gx2MPZ3GdpYslHfgnpUscQPYb2wLEN7V/MczyDP?= =?us-ascii?Q?Xp1TocCIdnM5DqqnPHx7bwfl3WKN2AyI1qRZcQlnoe7zHB9sH/CRvjd9nhPa?= =?us-ascii?Q?F6pb3/gw3ypsDqUgKbfJf9N2anl5CsyvcpJ4m0Gt4SZigbm20PjzLTMalmpD?= =?us-ascii?Q?os3I4RPNAdAWstn+tMQdNq3XY0mKEgblFP0waS8ZkNCYJqXiCQ2lcImHvDsh?= =?us-ascii?Q?zQtFyI2psfKHeA6SVvMLYbEouUteA7paHieE2FIE5CEYulIJJDqrEFIrt1q1?= =?us-ascii?Q?KwDaM/OsJnyLDEQzXLotfHp6oiF2l4MUAjKskwNWx+eKwWvSSSCc+t9Z41I1?= =?us-ascii?Q?9HzUqz2sejm3iWdyZougzNQZSKqe7zRXaDGsWveDanDzwD5S8En0eOQ20rNH?= =?us-ascii?Q?2EI6a9gawowkcU6afTuOgj1gkOE5g7Ow3E+a1kCiM3XU1vDnkxFzp2OVdX7K?= =?us-ascii?Q?5k68bzs87DreahLielySMNpB4PbUYOKTa0PrpJm3lTykf7cDgUj8zK0OigcG?= =?us-ascii?Q?8e/MW5NoucYnWYjCZKR7rh7/hD5PBufhTR9zD7kWeXX3lL1CiP7YKlHoUekL?= =?us-ascii?Q?/oFYxfXWvX/OJCl1yZCxwwMV8ybu+U5o2icNN601boQIwl3DKFL/Bt27i3jJ?= =?us-ascii?Q?pTit/i04bHqvCFlaBTvI1c0dsB5Q0Va3Wa+i2BuGzbpVNKtm5pZ2T9OLXSqt?= =?us-ascii?Q?jKuqEs3wQwTtwSs9/a4hCJi/a9+CiHBn1BwKty+ZVzZ95JHgDvg2Yv9Gh4RW?= =?us-ascii?Q?8Khc4nhelRvYmf+1QVqdwhhrve0KP+CkvpqikCYgSdaJpdA4xySjPq30yJpu?= =?us-ascii?Q?hw=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?DRV2HiZzXKSUg1accKBC8Dn9UTLlK5j5WxK2qCxhpsvvD8UZ9X5t4NvSLNJ3?= =?us-ascii?Q?pKRkcV73ooCAjbK953tV2ndPDCCm5y7UeFU3TyuyfcNEIB3bTq2ozDhmECtq?= =?us-ascii?Q?sR/7s0sh2Gurr57z6KUdE34ji46f3a6FSg73VC0hz9WXX5SSFJW5+Bmat3SC?= =?us-ascii?Q?Km2mkhc1I8vMk8ZRjdUwMWzKlxyi+KcF5e1TwB9C83HmnCdI4sKMkPs6ZQHF?= =?us-ascii?Q?HDFYVTO36eQNGgJvMxLXeIbswyWUScJUlhjumkQYXve2XbFoBBRq/xVF6HjU?= =?us-ascii?Q?8SB/lKLkF6dnkfrqseOFK/HC+RRZb4tf0VPrNArOn4330aypbhc5BxR6KkOJ?= =?us-ascii?Q?fcOdKByB18XiWF7nkQrNP5e+kkHiCtO+3YqK0T3lwEwKq4Mzqa8lJnIBBSCK?= =?us-ascii?Q?6FL3q1sFXjkKAk7s9WQqFdZeo5OxthZ383dkRRkIRKp7YdesD0qhafy0lr1w?= =?us-ascii?Q?pacN7IU7CHXcAdKOo0UxH9+PRWXaaSVPtFegkugFfEQh4ZKh6kxUIVtk+LK6?= =?us-ascii?Q?CbOKodMCHv1pfF+Xqq1lu1pfSLGgxMxvwTAjahATbIbUw/wGVYwwW3G4SUya?= =?us-ascii?Q?sL5wZaZg2tyWsKsbCGXfAahGEIUkO5KKEJbasDZE6sDeXXXsgz5FhJ7yDhRp?= =?us-ascii?Q?lSMqRlkv+27Vc6SqVhOWe6whCq/MudPHGExGBezxznYYi/Afq1DigBr8RyRC?= =?us-ascii?Q?2SUpRdxEVGobxZI5nJS3VUHxFQ2LChCGj3eyeihNZldeBRyzkce/3D1Qp1Ue?= =?us-ascii?Q?ID7Ou52jvG9Zk+RuhZWJJSDH8qBqsMGuh4/l4JnP3wc/+ddxUdY7rDYfSmwJ?= =?us-ascii?Q?7lxDy800rYyWv/cs+NuVLxz7Xmzq0Ey6EOIpO2dz4taQsSPj1IIIfjFQU1I7?= =?us-ascii?Q?9iJfdQ2EuuaVfCU6TPN/i7i58z+laF6FcPup2ecyXl6Jq7/u9w/tDGggjsvI?= =?us-ascii?Q?0SuDtgqH6m97QLTK8TXNfnFuKCWHZBkqAUfbRU5U+PMdHuusUX+CZG56S8qc?= =?us-ascii?Q?W84rEAyPTDPVIGwsVkzPgYFsnh2VmThi+q25itQznUDIg4+2XpcdP6KmGBIY?= =?us-ascii?Q?5bna4qdoU14A5yhWlYjviCE1gH9cem+mj2eyH/uKwfR/tcZBw5LZRAUGXqXR?= =?us-ascii?Q?1U2OHRktQBjh25fk4Nn4uyVRNSg/xLiG9c9ovORuI3dnjknlTV7RtFZWHP/e?= =?us-ascii?Q?Jdk73/kP9iLTeShe8gBdcPzS1yHKXr/Oxi8R0YE3bu+hokrAU6hN8w9jL1W4?= =?us-ascii?Q?EsoJsdUGdkduBNgcp2vv+uzbePgjRzfYKbfkV3YU+i9Vj0VxXcPgrVjTbQJk?= =?us-ascii?Q?11tIkuyPF8MmmzIk5/al/LtVJ4PWZ+DLW65nIW2MtpTkIOvi54Ft8NwzFvrC?= =?us-ascii?Q?FFvjkmh9Osg5XxD8mQ50X2+mRT3weSW9t+Hw/10o5jRo/zE+GxpSDaEHgd+C?= =?us-ascii?Q?fkWi9IufB2d5QcP+B8glwOMnyDtsA+hWnuromGYzgiQpB9/3zfbVb0W7PL0T?= =?us-ascii?Q?nwvxBAcT3pR6MjAswRIll1RMfhYa5Egt17CqyTRqnB2HUGZFukxAGkQhQaEz?= =?us-ascii?Q?+do1U/ZFqCFUJTPZMIM7APfatBcdRaRZuSiv3/8AKMgTeRTrzabzbJK9Ttma?= =?us-ascii?Q?MIxrv4ITG+RDrI37n609I5m8UQMkBRHUhALHh8DM7fUAJw/C3T00fL/Ysh7y?= =?us-ascii?Q?hRb2q3apw8TpLlabtZv/PwX0kRb6uVnV+sH/KAoEGeFgE5IzcWoT1aqPGrqq?= =?us-ascii?Q?DWwC3QcLlBjeTcuvF5/9D0R3DuvLD1uI/GZNtIhmbT7HozhccQ7O?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: e71d1154-427b-4810-cc71-08de569936e3 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:18.4437 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: Ody4ayLFw+6bf8zx3C7APHx3wEE/ySi5/fK6+3tsM63RYTVHarMUhXB3VKUlYBmz/5BxAsMD+rdAwgVC0pa8fw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" To enable remote eDMA mode on NTB transport, one additional memory window is required. Since a single BAR can now be split into multiple memory windows, add MW2 to BAR2 on R-Car. For pci_epf_vntb configfs settings, users who want to use MW2 (e.g. to enable remote eDMA mode for NTB transport as mentioned above) may configure as follows: $ echo 2 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/num_mws $ echo 0xE0000 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw1 $ echo 0x20000 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw2 $ echo 0xE0000 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw2_offset $ echo 2 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw1_bar $ echo 2 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw2_bar Signed-off-by: Koichiro Den --- drivers/ntb/hw/epf/ntb_hw_epf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/ntb/hw/epf/ntb_hw_epf.c b/drivers/ntb/hw/epf/ntb_hw_ep= f.c index 2cefe46d2520..007c93e34398 100644 --- a/drivers/ntb/hw/epf/ntb_hw_epf.c +++ b/drivers/ntb/hw/epf/ntb_hw_epf.c @@ -843,7 +843,7 @@ static const enum pci_barno rcar_barno[NTB_BAR_NUM] =3D= { [BAR_PEER_SPAD] =3D BAR_0, [BAR_DB] =3D BAR_4, [BAR_MW1] =3D BAR_2, - [BAR_MW2] =3D NO_BAR, + [BAR_MW2] =3D BAR_2, [BAR_MW3] =3D NO_BAR, [BAR_MW4] =3D NO_BAR, }; --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021096.outbound.protection.outlook.com [52.101.125.96]) (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 CF55E350A2F; Sun, 18 Jan 2026 13:55:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.96 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744558; cv=fail; b=V1PJJMevKpot3oqPfUHRPIYjOwjW+xuh8pWNwEchGTU4CYlIFPA1NIyIYiIJ2rIFVp5ok/AdFTfLnN7JL5lm8jtNcyaKwg27PTQKv/6hw3NWtbnyBVkNpFCxt1WLoFxMWWD/2nOo1Ck9oDqQHu+7fWjNBauAIWVZDXJJg7e9LbA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744558; c=relaxed/simple; bh=UuXGLZP37ij+tRp0htfcTkXjgDsuQT9RGFOc7U0xI0o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=KRtJYmj9lOYy7Vyk8U/DAzdg+ZrW7F6viUDB14S+CITyx1SyFEbxgCyNy0o0zADIPIeRg0rf1k24Haqa7ekak99aF7T9FZUjmoaz2hHpeAy/NKnXHfu3hHsqKW0i1xTJ/9GsxkLltResRQdP+ppUNl4CG7MYZX4UkHeAVJ3SMIQ= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=IuuBvnAd; arc=fail smtp.client-ip=52.101.125.96 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="IuuBvnAd" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=O8Yfb6YL6P0wazQc5cyhfNaEQifSw9QbhAKmgnN6Zo4Oq4GFAHVHDTMMzdB0Tv43f1ZCYMGFuRGQDQTjqeaic09CKy2JVPVxsJTJwRgVVGbRxKHUYi6yHaLw7cAWYceheYWFDQag0pmnOzDbApQxhN+zPadtDMDoypZRQvhWVp1twKUSOBQiy0XwC4ZrII8fZj8nTA2Rc7yMKnkbeTY6M9AOFvp2XFvkE/X6yU4n3XZZkA86OHiHAGuxgG3rL6kJWh0KurVHW2kxZuVKpw6UdvQtPW00b+CNvuideZorohnMQ1V1AEaEEX5HEfeQvO/Cy5ZIv7ta1WINGtuLrRLWlQ== 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=Kc0ZovYMMNE566/oX/46iFpesbOPkOjEHJvHSPWx/os=; b=nPhungfL7HXOIGyKn+EVqWHUqk0Bk70F4t9FoZaA4eABcr+QWsdXcGf/WzCFnm2/5HRPWy1r/mtvhpZfn75Ili/61c4OCJeTTOn8S/3w6zfsLzgiT5AjtbONSh/+BJbAj2MwGig5gRTwlh++XigaMMLoE40RJaJZ035DYsKu87AU3tyonYSVQ8AuG/FpT3JZK70VvPO6eiNs49TQ9HsId3og84hGUN7imqzOIDos1JFRgqAWEcbuR3klO2qd7TnC/KKhszslBVfND+T/32QeqvLvbUBlqS01gnbdh2DK19NwopFMEvcaAm9SDtVzFlZyPfRci1CW0o0sSGjdsjaWyA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Kc0ZovYMMNE566/oX/46iFpesbOPkOjEHJvHSPWx/os=; b=IuuBvnAdAPcVjwWIQUdB21d/Q/UAUBylapaDXPoRLPFJduYaLcGMFpwFrsqnp54GWmLEd3tJeT+H5VzCI1/dLR7lNhay/NEiFhXtuzFtkAOU1FgvgahLWYzddOUovZEcNbjgKnD1LPeCuWNNcz/4IB2YLcdmh3L/hyY0fQ9N5nU= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:47 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:47 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 33/38] Documentation: PCI: endpoint: pci-epf-vntb: Update and add mwN_offset usage Date: Sun, 18 Jan 2026 22:54:35 +0900 Message-ID: <20260118135440.1958279-34-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP301CA0044.JPNP301.PROD.OUTLOOK.COM (2603:1096:400:380::6) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 9148de71-5f3b-4919-09b6-08de5699377f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?rF5wSoIVziqj7UiAw5yTEWoRiHOYfHfyIlHlwyz/80pl2xlCFIUllu4j2FpB?= =?us-ascii?Q?V0RPe+uFZ2Q5MCc5+x1Oc2deLQn5dlwOoYTnCib/WQf+nz5AGnweZZ5vDPPr?= =?us-ascii?Q?wG8WbDfcULFg/3PjBiJ4CZf6en483omlcz1C9xCPF8re0UXyLrzu9qqK/kr4?= =?us-ascii?Q?OPhPNXkQCBaU6+5D471DcqiEe++rYU13GJ3QfNujNaFgv7kgEOG4IVNvvlJr?= =?us-ascii?Q?SHc1Uc9kcFXu07HHJFczSufosLCT7U9G7PP9CN71VlR5YptxJsGqRTxi0qMh?= =?us-ascii?Q?OMMXk1fNY7qCucxwk6scyBNMUNx9i7nVGQbe+ckIMuLgjOKf3UwQ97W0cW9q?= =?us-ascii?Q?e1L4UAepRknc/PLzMARoz9nT2JhU6WpGFarKRtbGV3Z+wHFynNdc9DFmkm9y?= =?us-ascii?Q?VJ3qE/ELgyQFzwyCghZiqDPGoxtQ29a01hvBtavwtTYZb058KtHrgqZ7qunk?= =?us-ascii?Q?VhEbhBp9PyayvY84OqRDnCwUR5kBKlky7yhZkcaqSREAcC+2euG+BLrzaTMv?= =?us-ascii?Q?yf0kTeMd0Ur9xh+KQG5mZoaNPu5qGQbvsY8sMnqJs9ZLfTEBPRWZojvIiuTS?= =?us-ascii?Q?p/Fxkd8OGleZr8fhay21ytaVubgcF02vxMUHTgwDy43SXbTZ5+HMTkuTCiIn?= =?us-ascii?Q?RJGgM/xnz/u+D5yViWk7iYkQVxE0txs0zxDGlgvcxEUj6UlrxnSit466wdqa?= =?us-ascii?Q?ya/2jQRul8vl7i0KvxswyvK6l6YJWIuUr2FApK4Rr3UdOlmIql6xMEmMIMC7?= =?us-ascii?Q?tg4syY/L9iuLwj/+xm+71izYOIt+hO9RjBKq4dTiKEkWenewYhsjCFq24RMO?= =?us-ascii?Q?UA7V5nA1vSMrrjA2LeGZbol2oXp83ZLCj/R5iNXckprwE3wFmvCeJTq1yyNR?= =?us-ascii?Q?XrtLm2H/a5fCGMBJv0t8OgNVqF2RZmp1gwrFMgyaUbcWyhs1M3174iYR7y0I?= =?us-ascii?Q?6EnfLYj/c60/P+wMOgvoDc70e7KimHtKXro7hc0z75OIqZr356zjfYenkhUD?= =?us-ascii?Q?OEK8bPH2UGzkD7ZmbuobJcYv6ZHE1753t3sy1aeC/Pm+OQp5qFfduTVhxCwj?= =?us-ascii?Q?rb5yU2WzgMpcX4BmaWVymYB6s94ykyvHJNZFxhD459rIEtac9atl7zFw93dJ?= =?us-ascii?Q?gC5FUNpqxK//j8PSorXyCYWKkn0Dcgolhn3rguw/4QeOtUpcg0nmi6oaKN43?= =?us-ascii?Q?atE+CPcOBMCeNIcO6OC1h3dYiw4dvWVeLom+qdsx64EJhT60GoPGXmhZGV2z?= =?us-ascii?Q?RyHiLU9QAuX7bGSwTnJ2ptmrycbLwuOksUUbplb0sLU/tz09ifO8GGf4vd5Q?= =?us-ascii?Q?7ETkNEsr2NYMfdvvKT3/Kyj+ZnDijgY+dd8tpAFa1dtAqtTNT216hBZq3mFp?= =?us-ascii?Q?s2ClFHj19CPWGoMEmHeC7gwKP1MC2ZAvCjLinjFy41zDZpnrp72Hr2MZoiDU?= =?us-ascii?Q?ddcsjHsU2NccY8/PjmWZ3F+qJ0S5E19/1GSFRITM4Mq0qbzYxZS1UDjCV2CD?= =?us-ascii?Q?nDTAy2gOxtJPIh4ZFYc/KkysF9+zuQ5wNXV5vU+vn1jSXuxfvpjVucx7Kl+i?= =?us-ascii?Q?xsvFRmZ15gH+zeKEj1w9tM4hVHNHkjtxFcpcKOOQGOmDkZ28ArTxcavvUzej?= =?us-ascii?Q?SA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?JFZNuyOWk30FYP3X2M1z/ArRg6Q5bLbXqDDVqvalzUuwDpY2jFlKLA1boMxz?= =?us-ascii?Q?V+F4T9TcXNjSbL0XHGvEIeu83pcKJ+7zZlLJQyop+K/l/VzcggptIk3Wzau8?= =?us-ascii?Q?qHfYOUEBif0VYjma//NvQ7H/5ZbcA5uaS+hJ6bepvphp3mwWMVRlT7daCXQd?= =?us-ascii?Q?bTIHEU2+AZLG6s6cUVSFWDHxNiZIMnFY8zeyznupOLPhe4WPYxCfa7We1LtZ?= =?us-ascii?Q?2i2cdFJHfXTVYn0wBqFI6TvemXZDcTLQqKDBY1jhOlR5hHtw0cabM4qsYfAK?= =?us-ascii?Q?mAXp9cN3vWhwtYx6tQevdzpVPq1LZ5XjCKK/9DiA/VtutZeKkmFnKIQeGv2e?= =?us-ascii?Q?W+cimL1ZBJBZxXMXVvKlYzMSQLztPeDEmfUohpqxSjljkkBlqu0Niq987xUa?= =?us-ascii?Q?Gj+6YM7NA7THnQ0hRbzIIsF9Vgd1eOHOnORU20gLDquZTRfeVn0CEj7gE9rB?= =?us-ascii?Q?8QeyL0zO3FvyO5MM3jemNWIk+qO+M/8iSdg181hD+0YWeZTVhNh3vLdxh1nD?= =?us-ascii?Q?Ol3xUPbFB2uzlJjE7sM1wEfu+gvgnQuFbiWqDgi4741L6eg1OBAReZ7F8KPO?= =?us-ascii?Q?bZQgGv4FH+6c/Y4JTc7KHyMWBs2e5S4Vt4GfIn+UxdlXHl4LUGGKRcGyKv91?= =?us-ascii?Q?zHg6+2yYMi3I56bEhhx3MrcXVHT/s544P/OAD9Dq3IEIo35SrtFSE7bcd97G?= =?us-ascii?Q?j8X0SX3HpaZcK4vXDeTHVUwgukjeTwbiD3vChpyGz6sUlyj/8O4hsEe9hnvk?= =?us-ascii?Q?G17BUae0N5TvPTCR/BA7DYUUL3ALkks7Ge54BIaYyo7k+Ns4wg6J3mSIEsas?= =?us-ascii?Q?WnzE2135COP5bIe2JX2+JYx3Wh4AdIgB7ZvjdP2TnLGcWA7pX/RbqS8e0n4Q?= =?us-ascii?Q?QOnEgsBjie9Kie9KXOmO0gjvPOyV0tzAhahz49G2hIQnJMh6u+HgoEkXicJw?= =?us-ascii?Q?9uS3OSRMkAtoO5LU26ZijtuOod41f5N3OaUQzTq7oyfQXmY/DKp3CAv6FdPG?= =?us-ascii?Q?9NMApr1ExBsvqnw3R4u1MkLjv4lMfh61UoJd2q2JOm+4BQiwQr3+nQeYSZGw?= =?us-ascii?Q?1UeUArcCDop9I7NEHrFWzCeZJa7ZNEXr4hj+Nkatqz9ELGLYhAT3j0oM+Cmd?= =?us-ascii?Q?WfEbjrDrze6n6odsA0XRoMTTBghNc4Iva9wDQFQdxboubIvNMIzRTsZIWfM5?= =?us-ascii?Q?UnoAGUVVoAt+gAjUiNZZD/o6oZvMPlQ6xnpQAjjLcxhK35XaDtFKF29WCpWl?= =?us-ascii?Q?ofWRAVJhfdtsTv+ukGK+qSMWlbOamxiSHVB6RlH0C+igVSsp5D2kptXY+ywX?= =?us-ascii?Q?cO5mQx5FhKFH2oir+yiT8kpM45NAk0pfaUmdVQs4Ui8iVYdXgzYVXkSq6FTX?= =?us-ascii?Q?h7QqtFDvjlAh/gi8G+DV+qVVxGjMtNflt6Y4sTjIk2fsGEf3buEjqtg5biNP?= =?us-ascii?Q?uib+78vFqFRicMPCbngVOy4mPCDFrjr8BH5oUTJd1Lvh0l9p1NfuUp3j9oI3?= =?us-ascii?Q?mxvuy5mwacExinVYJ4LgoxlVBBpXswaZiMNx13q272WPyHeeHcMCYnrZpqJS?= =?us-ascii?Q?KCiQXY1jkIu4OdoBUHDXPOiLF6Vsxri2+YZVewVsHyPOB+KS+LaHmrlnKzJM?= =?us-ascii?Q?OMWKPMxF+0glQuFdGaOP8FkXCb3ft8K/BaNw0uDNWKBkWtWJ4fKk+8ntsaJa?= =?us-ascii?Q?go+MVk2K6dWIsr3PVBD66Zrmi2TO/RDV+MtaC0c0/GVcfr5+8Ipuyl85/X5x?= =?us-ascii?Q?y6mLKHk3xnjZb43kXszDpJFwSoJy19zTfFYCNwapdjFJtuFq+Fvs?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 9148de71-5f3b-4919-09b6-08de5699377f X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:19.4634 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: eaChMWr9KA/D8dufZYhQFIobSagIl0nsfETjIp+amqtyufwWp0NkXvSAXeH7UHpguhKE8cpTNbCn/a0fGYssnA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Add a concrete example showing how to pack multiple memory windows into a single BAR by using 'mwN_bar' and 'mwN_offset'. Signed-off-by: Koichiro Den --- Documentation/PCI/endpoint/pci-vntb-howto.rst | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/Documentation/PCI/endpoint/pci-vntb-howto.rst b/Documentation/= PCI/endpoint/pci-vntb-howto.rst index 3679f5c30254..097826f946a9 100644 --- a/Documentation/PCI/endpoint/pci-vntb-howto.rst +++ b/Documentation/PCI/endpoint/pci-vntb-howto.rst @@ -90,9 +90,9 @@ of the function device and is populated with the followin= g NTB specific attributes that can be configured by the user:: =20 # ls functions/pci_epf_vntb/func1/pci_epf_vntb.0/ - ctrl_bar db_count mw1_bar mw2_bar mw3_bar mw4_bar spad_count - db_bar mw1 mw2 mw3 mw4 num_mws vbus_number - vntb_vid vntb_pid + ctrl_bar mw1 mw2 mw3 mw4 num_mws vn= tb_pid + db_bar mw1_bar mw2_bar mw3_bar mw4_bar spad_count vn= tb_vid + db_count mw1_offset mw2_offset mw3_offset mw4_offset vbus_number =20 A sample configuration for NTB function is given below:: =20 @@ -111,6 +111,19 @@ A sample configuration for virtual NTB driver for virt= ual PCI bus:: # echo 0x080A > functions/pci_epf_vntb/func1/pci_epf_vntb.0/vntb_pid # echo 0x10 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/vbus_number =20 +When BAR resources are tight but you still need to create many memory +windows, you can pack multiple windows into a single BAR by setting +``mwN_bar`` to the same BAR number and using ``mwN_offset`` to place each +MW within that BAR. Offsets are in bytes and the resulting regions must not +overlap and must exactly fit within the BAR size. This may fail depending +on the underlying EPC capabilities:: + + # echo 0xE0000 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw1 + # echo 0x20000 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw2 + # echo 0xE0000 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw2_offset + # echo 2 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw1_bar + # echo 2 > functions/pci_epf_vntb/func1/pci_epf_vntb.0/mw2_bar + Binding pci-epf-vntb Device to EP Controller -------------------------------------------- =20 --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021122.outbound.protection.outlook.com [40.107.74.122]) (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 9810134B410; Sun, 18 Jan 2026 13:55:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744559; cv=fail; b=njAktPBacXEyuWqg65AZMHTjrhGLgWKeTm6IeKsCxSsyQk+rJFmQEVO7WxGLNaijx9RKZFNiBZsuhPdgVCINtKVKhzDvkJmPwXPm1HZ75Xi8J6FNPcTKuWNbCyLfURliSpPf3/BDTPXSw8vGMetYEPsumzbErtyB+t2LJlUmW74= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744559; c=relaxed/simple; bh=XTAf4moWA3ONm/EDufGRoCTADoj36/C2rHn7GqSZFJ0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=C+gKe3ElP2ZrJc42hdb8SCyl8fqtRm8r2WlfFXJeqpNLXw8Y2GQ2qFhGb/ns+VnMXwYjWZzbSIHt6feXMJxrezSuB9vcrBTjw/iN3pgdHrXVIIHXI5LNFa8ODr38NWURtc6Q2dOuw7jpUl5AEq+SI/L6oGwTL6va49ap4zAQtS8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=OzgBPjOP; arc=fail smtp.client-ip=40.107.74.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="OzgBPjOP" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rNCq1pdam+LHf1AftWZW8Aj66FXgVaWvisDPSdmj1Tzuwv2gRzpdZ2ymcNQ2p0V4tnociVUztdCDe0ZekWU0/EJAqX39lFxcPsr3hqtdl26eTiiEihHBgj4XQfJ71bE/SCYWV0oZkEE6jv9XINqLa32II2yNeniq22PkCw6M75vuwFus/TxWf1ImvUGXtLu0GddMaGThTsga+WmloCKBwfuYJlW1Pe8nKiPrKtWGrSUlHDvRDIDYZI4YYiAVsGs0vDqUFGU4+C+8ONPu0V7EeZcjidIEee0LlQ2JBJbDSipE3XVpe8NiGisg+xrDxgC4KN2uMyG35c14am+TFcbtjg== 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=EqZ4zFSJKcS2aXV8+pNLIdL+h0NJNfQfOFRYdRf/uRY=; b=JnTwzg9xYTp+TF05yx7IwV7O/N8Gf6oK7KkLX84KZvi9urEeSD5WautCsD/a/ir1ihvTimK2bu5iQZOCoX161wprnm4V7paHf/AW7i5u1SipYTjgrC/LF/LDiel0mRT3j7xgmicV1pDPncJx4/XT6XY65XeYtOUYzBPljCgKxBmm4MTReq6xq8zI0tJXACUtHIqlKP1Z/blhk2zCbrXfwqv9cmi58Avnm+/LmrflysppTq4XaBx+uW6q1V6A1EJIyL7lUfrQ218iFuParMVl+GoKMari+Om0ZZHaoPb+L3pWuEi7tTlfEtJqZbDN4ObboVggs/vQDixGwyUXfGI2Zg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=EqZ4zFSJKcS2aXV8+pNLIdL+h0NJNfQfOFRYdRf/uRY=; b=OzgBPjOPjSiwS5I5P25maVfU1Z1r5X3hWfFQCtFs52oeZH+WiINdt2KqC7sLEwKzdmquZru43k900q0XPRg3f+XgUDUP8YASkzRx4QamOsP5JUTufmVyfIdf4/6RXP3xebyXceeJTxidgmj7n+WpqQ2r6Y5PmWhptsXB2t7Vd9U= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:47 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:47 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 34/38] Documentation: driver-api: ntb: Document remote embedded-DMA transport Date: Sun, 18 Jan 2026 22:54:36 +0900 Message-ID: <20260118135440.1958279-35-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYWPR01CA0035.jpnprd01.prod.outlook.com (2603:1096:400:aa::22) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 05f1054a-752a-46d9-9455-08de569937ec X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?KXqGKxjr0Rmd020EU3Vb7auqyUc3JS5JqRAZ6nbdBH8M4CPBJ8dDp+zacGUq?= =?us-ascii?Q?/GyyOix2QPej7YOaPrRkXzLuZANmfnyBM8Cy6KSdrCGgR+l2wklmjqlG8rzt?= =?us-ascii?Q?ZkjUgP18JmY3atGKzEi+T9xmR/OMkPwj1le+nl+ntkR0juLOo4Zix/Fufmst?= =?us-ascii?Q?h1sdiCEy7YNvErJP9rdy+MbqsQP95SFUIHRmVCT9pyqdGQ6DoC2u2BXi7aev?= =?us-ascii?Q?M5jIK34MQjN1zSvhHwLFWGvcWePaTyKn6wjJ0vBSzjR5UJbq4JXcjv60GDNe?= =?us-ascii?Q?AQw9R1UrG2lQHJgaz795pAd68ojLW4qlXDDqSxixNk7zMz7V0R1+7+QMijmt?= =?us-ascii?Q?VnuYdEOuqg20PenDzVeX0XnCKuIcpUZEyqgd7sziNnyRsprignyiChh0hr6d?= =?us-ascii?Q?BH5+yM4lYsyR/5Me4HwXIYEZ6QAZ8xCPGE42QFjjJiR1jKjfwr0pMoOfK4VQ?= =?us-ascii?Q?vYsIW7d9gIhrM0jXRlf+eEFtoHvFkZNTHOuI+XgYmzUM3KQhKxtcfAHCVCq3?= =?us-ascii?Q?e8c/R9vorBV7UPI3psHEFZrWNi0OAyV/UMZsyHMAbRgyqlepFkYJFOHRSL4g?= =?us-ascii?Q?C4FYtnDVsox3KIKrqxTYxgQL9bFK3MIyjMmMD7NRKO8nTY5y9VFThw/zoNXf?= =?us-ascii?Q?BXIf+B75JWrlN5K5TSCgKk7gc5VngcWHUsJhCgv/9aWQTK39H338gVGNsZio?= =?us-ascii?Q?4TrIeIlXEn1hLENi09foF3OvinJBz3wZXi8RJM88zDXB50FWslSbsgJAmq5v?= =?us-ascii?Q?ZFaZBAN1wOK9klNqtKwLUWOH3TYcf5E7O20r23rGnxIBebjIjCM3Brt5b5bD?= =?us-ascii?Q?9cjElvZrdyqWq6S+GsJDSNplHy60K4OchHTf4BZMPbDBrrnvpuMVPxR4Finy?= =?us-ascii?Q?lkASub9YDwziFDaXrGjC9yB1IRLBDDDeILLTx0qnGV5R/2+j6dXIfoGs1+dt?= =?us-ascii?Q?7srBahSt81KjW8zKxzwzh3j5c8P3rc1J6sySXe8ktRKokMM0kwv+qBpoDmhu?= =?us-ascii?Q?KYYgOes6kHuUIiEqei62iXaXAGkaJEaltgVhD/IdAxF1fGk9zZiBnRUSIWZm?= =?us-ascii?Q?79XyySll6OqemtQUlhbRbCwE9089m3zqDpXUJhVu58j5BtalO9z6AmR8AtQO?= =?us-ascii?Q?AAAjdaMzSYRi8qIVLG293FT7ufIlMOuf0Q5I8JAoBADIqmPd47635r1WVEyz?= =?us-ascii?Q?KL4KwB4MIoExhkf1OEdY457YJf11u3X06so5S111iCTH+mLpeMyBefk6bNnY?= =?us-ascii?Q?gfRfmeB8bbg/I1V7TuWwlS9ZMMilrm43eA6gHt9v+ViJ3+ydphHfROju2c+r?= =?us-ascii?Q?MMk0Xf9hSccgKBIwDdGt/sBvykf8dbii2BbMBQeKx1WTaQeLkL6+bai1wbRR?= =?us-ascii?Q?jKE8U2uIZL0ewLZPqjEloLscBqlDE9w45pMAZxrJh/6F8ckL8ZXoA0RlNcwu?= =?us-ascii?Q?Z0Q5ySVLQG9dW6XYJJdU/c0cwSmjwFgCHoErhBzu6NFDQEk2PGUFcf5zlJGE?= =?us-ascii?Q?VgCjj/rDMgfJ/5EUFB6BD7dmZdghQrVvmGPU1Feor+NRaK2h3dW74k+Lq6pu?= =?us-ascii?Q?UKSqZ4kg51b2wroEfJmc0+W01mg7NXUdRODXFTeSmA+jp0HFMxxiAxrbtwWA?= =?us-ascii?Q?pQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?haAFqZSMRVt8o5akNoJC8cMTex1qT3ISt2aONoyA+fat1LvuDm3lav63KHPP?= =?us-ascii?Q?OWCZKR1gjUxorufT89PIuanIxoe/CRulUoWd0j6OMTL4YlRok7YwYlKFbyW7?= =?us-ascii?Q?NsGTQsvhgHYKfXx/2qH7MTQcG9+Irwo50wFI3TFZ47+wuah7p7zcG9dljVNW?= =?us-ascii?Q?UgtZvuKihYXOvpHAB4vsZGExrEbmgXOdenGLNA/kTXWfImkpOsxZjMyCUPRR?= =?us-ascii?Q?7MDa0De2hwVE8gYo3AhPOhzu3OTM7FlokP86Jg4OazRc4TVpN/je9VSJZW9V?= =?us-ascii?Q?8PBjBiVdJ0n0FoE7i8KkuFhWG2nuN3gXK16Kgvcg8JirFniyzzXOC/K8lMlo?= =?us-ascii?Q?RlhQrilr3eDceJSV3HT3hfW5MzEWYbToooK5Rf7/SC4bKvTN6GTGw9lNVPX+?= =?us-ascii?Q?aS0u5B+acv0Uh2RvKB8g6febI6tsqielPpV0IHU0W6bVAVBXVTRH0jUWyWKU?= =?us-ascii?Q?Y5GPO2W9mCNDvefYEhKymUFs1AAb/c4j4dK1VK/YzQatZy+WyjFHRcoF6G+4?= =?us-ascii?Q?e4ZPdHHZx02zllinhwi8ez+LwaOJ6317y66Re4CkLd1VyMTt0MvPPa/6Bfdy?= =?us-ascii?Q?O7cRXp3Y4ZITpaagQcciqvYbwwhN+XOyDZi1co2IBYMaaSWrsY0vUfz6kg+B?= =?us-ascii?Q?pb6qA69Xq83VLlNW783m3LV/RjZ9UPfRUSG1Oo9g5IAgIRqddt9ZhWsWH7Lx?= =?us-ascii?Q?BY0UdSur9sS5TSNV9hESQdOCpALVJwiSnoGr4/kvVUZr6sfJz+jmdctYC1xO?= =?us-ascii?Q?FEKwgr9PdD/jKoISduOe2voaow4IdYgpsSQNBQ6J0mhM8NVHC0IbezxyxI6X?= =?us-ascii?Q?wrIdCgNjliUVYmmcyKf7KaEQp711PTSVHK+BewzB6ieWeq3lhBuRLFcqSzbJ?= =?us-ascii?Q?wJnFWVLvfMQoUzBnI7FZECcPIiwo4wyq39vo9jAHrA+neYWtuWxE8qY53ylo?= =?us-ascii?Q?H3ldsD/K4A2uqPHULh2c3W4Hpfl31S3qHVzegfPbBfroqgo+D5m0vuXJtRE3?= =?us-ascii?Q?rwT/jnG7rqeauhoa2aG7U2xGzz/6HZTUyyqnoFOAjGNULBkVqHC1cbCkQRxI?= =?us-ascii?Q?SKV9bnYKxHtuH1rRSeFmlqb/sTlsbK/ouidbjAA1oufW/iFnDuU/fIuF3yfn?= =?us-ascii?Q?AVguaPpahMRr3eeT5zmaP3N9b5piLmEA81UALZmow/XJ6Ir+gaMysmmvs3Vf?= =?us-ascii?Q?rCbsYg5eSfxpBenqx5j2GiKPuElVJesr66G3aPjMhXB1KJYkD6EiwJPhwicM?= =?us-ascii?Q?f1sRuvaWPXxd4CbpSfqw7e0fcZ4jJcxCtNYXv73X3D/OjCjUscz5n/VGxunU?= =?us-ascii?Q?HXa2fYXegtwyLVRJfokCCvXRwTekwlfIykKoijSTmheBnr+tju357dBIq+o2?= =?us-ascii?Q?6cSPsGQQJcRVwRURrZipUw6+Kv5V/50kSQNL6rTv9AqBw1HPmkTSrRhXDmhD?= =?us-ascii?Q?IvON2tq8C38o/YFPulUwgwHVnoQvDstIICB80OnJMNJUSLcpd2Swa6fJ1KqS?= =?us-ascii?Q?sQlIVL/R5q6ijY1KCH583frRh8qgmHAAZImqWNaFm4JE+1Q3viypJ5V6hYAP?= =?us-ascii?Q?YL4diPGSFh5KtEzNDTtO0PPVzbkSwHZIqCn8LCq/2VfY7cbLi/wEdJlxQ2qZ?= =?us-ascii?Q?PR87jJPxs3SQ3wBDy744xIthCRpYyjipOnU+pxHSl7GvvDh68HlrVsBOefE5?= =?us-ascii?Q?CXzwMWDrY/8Q3E8alga4zxeMQ8JSWqKlF5qrLnOqU1z/d0c3F3c6vcPBPZ/d?= =?us-ascii?Q?KW46VMIOQpfIAl22+BiFzQuIUttaMDgXd1C6/cbIUcyzDXWqL6Y1?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 05f1054a-752a-46d9-9455-08de569937ec X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:20.1837 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: A4FBSxwPGhr5uUoKfLDvcmlIOX18bS55Rnbw8q/DOzsi+vo3AZiYKgfW4O/fwQbCOc0/pffOD7urbAhmOlPC4A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" The NTB transport code is split into a common library (ntb_transport_core) and NTB client modules. Document the two transport variants: - ntb_transport: legacy shared-memory rings (CPU/local DMA memcpy) - ntb_transport_edma: remote embedded-DMA data plane Also describe how to select the desired driver (module load order or driver_override binding) and add data-flow diagrams for both directions. Signed-off-by: Koichiro Den --- Documentation/driver-api/ntb.rst | 193 +++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) diff --git a/Documentation/driver-api/ntb.rst b/Documentation/driver-api/nt= b.rst index a49c41383779..75f96726c373 100644 --- a/Documentation/driver-api/ntb.rst +++ b/Documentation/driver-api/ntb.rst @@ -132,6 +132,199 @@ Transport queue pair. Network data is copied between= socket buffers and the Transport queue pair buffer. The Transport client may be used for other t= hings besides Netdev, however no other applications have yet been written. =20 +Transport variants +~~~~~~~~~~~~~~~~~~ + +The ``ntb_transport`` module is a thin NTB client driver. Most of its +functionality is implemented in the ``ntb_transport_core`` library module, +which provides a "queue pair" abstraction to transport clients such as +``ntb_netdev``. Another transport variant, ``ntb_transport_edma``, relies +on an endpoint embedded DMA engine for the data plane. When +``ntb_transport_edma`` is loaded before ``ntb_transport``, or when an NTB +device is explicitly bound to ``ntb_transport_edma`` via sysfs, it will be +selected. Only one transport driver can bind to a given NTB device, and the +upper layer does not need to care which variant is active:: + + +--------------------+ + | ntb_transport_core | + +--------------------+ + ^ ^ + | | + ntb_transport -----+ +----- ntb_transport_edma + (cpu/dma memcpy) (remote embedded DMA transfer) + | + v + +-----------+ + | ntb_edma | + +-----------+ + ^ + | + +----------------+ + | | + ntb_dw_edma [...] + + +Legacy shared-memory backend (``ntb_transport``) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The default backend uses the NTB memory windows as the data plane. For a T= X, +the payload is copied into a window-backed ring buffer and the receiver co= pies +it back out. Copying is performed by the CPU or by a local DMA engine when= the +``use_dma`` module parameter is set. + +This mode is widely applicable but is sensitive to memory window size, as +one descriptor can hold the entire MTU-sized packet data. It also requires +one extra memcpy on both ends, as opposed to the Remote embedded DMA +backend, described below. + +Remote embedded DMA backend (``ntb_transport_edma``) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The remote embedded DMA backend moves payload data directly between the two +systems' memories, and uses the NTB memory windows only for control +structures and for exposing the endpoint PCI embedded DMA engine to the +host. It is provided by the ``ntb_transport_edma`` module. + +The current implementation supports Synopsys DesignWare PCIe embedded DMA +(eDMA) via the ``ntb_dw_edma``, which is the only remote embedded DMA +backend option at the moment, and the ``dw-edma`` DMA-engine driver +(``drivers/dma/dw-edma``). The transport is not inherently tied to +DesignWare: additional vendor-specific backends can be added by registering +an ``ntb_edma_backend`` implementation (See ``[...]`` in the above figure.) + +At a high level: + +* One memory window is reserved as the "eDMA window". The endpoint maps it= s DMA + register block and linked-list descriptor memory into that window so the + host can ioremap it. + +* The remaining memory windows contain small per-QP control rings used to + exchange receive-buffer addresses and completion information. + +* For RC->EP traffic the RC controls the endpoint DMA read channels throug= h the + eDMA window and the DMA engine pulls from RC memory into an EP RX buffer. + +* For EP->RC traffic the endpoint uses its local DMA write channels to pus= h into + an RC RX buffer. + +Because the data plane no longer uses window-backed payload rings, this mo= de +scales better when window space is scarce (for example, when using many qu= eue +pairs). + +The following figures illustrate the data flow when ``ntb_netdev`` sits on= top +of the transport: + +:: + + Figure 1. RC->EP traffic via ntb_netdev + ntb_transport_edma + backed by ntb_dw_edma + + EP RC + phys addr phys addr + space space + +-+ +-+ + | | | | + | | || | | + +-+-----. || | | + EDMA REG | | \\ [A] || | | + +-+----. '---+-+ || | | + | | \\ | |<---------[0-a]---------- + +-+-----------| |<----------[2]----------. + EDMA LL | | | | || | | : + | | | | || | | : + +-+-----------+-+ || [B] | | : + | | || ++ | | : + ---------[0-b]----------->||----------------' + | | ++ || || | | + | | || || ++ | | + | | ||<----------[4]----------- + | | ++ || | | + | | [C] || | | + .--|#|<------------------------[3]------|#|<-. + : |#| || |#| : + [5] | | || | | [1] + : | | || | | : + '->|#| |#|--' + |#| |#| + | | | | + + Figure 2. EP->RC traffic via ntb_netdev + ntb_transport_edma + backed by ntb_dw_edma + + EP RC + phys addr phys addr + space space + +-+ +-+ + | | | | + | | || | | + +-+ || | | + EDMA REG | | || | | + +-+ || | | + ^ | | || | | + : +-+ || | | + : EDMA LL| | || | | + : | | || | | + : +-+ || [C] | | + : | | || ++ | | + : -----------[4]----------->|| | | + : | | ++ || || | | + : | | || || ++ | | + '----------------[2]-----||<--------[0-b]----------- + | | ++ || | | + | | [B] || | | + .->|#|--------[3]---------------------->|#|--. + : |#| || |#| : + [1] | | || | | [5] + : | | || | | : + '--|#| |#|<-' + |#| |#| + | | | | + + 0-a. configure remote embedded DMA (e.g. program endpoint DMA regis= ters) + 0-b. DMA-map and publish destination address (DAR) + 1. network stack builds skb (copy from application/user memory) + 2. consume DAR, DMA-map source address (SAR) and start the DMA tr= ansfer + 3. DMA transfer (payload moves between RC/EP memory) + 4. consume completion (commit) + 5. network stack delivers data to application/user memory + + [A]: Dedicated MW that aggregates DMA regs and LL (peer ioremaps it) + [B]: Control-plane ring buffer for "produce" + [C]: Control-plane ring buffer for "consume" + +Enabling the remote embedded DMA transport requires: + +* ``CONFIG_NTB_TRANSPORT`` and ``CONFIG_NTB_TRANSPORT_EDMA``, + +* a matching embedded-DMA backend enabled and/or loaded (e.g. + ``CONFIG_NTB_DW_EDMA``), + +* an endpoint configuration exposing an extra Memory Window, which, + in the ``ntb_dw_edma`` case, exposes eDMA registers and LL region. That + means at least the two Memory Windows (MW1 and MW2) need to be present. + +* loading ``ntb_transport_edma`` (instead of ``ntb_transport``) on both si= des, + or explicitly bind to ``ntb_transport_edma`` when both are loaded. See + the following:: + + dev=3D # pick one from: /sys/bus/ntb/devices/ + + # switch from ntb_transport -> ntb_transport_edma + echo $dev > /sys/bus/ntb/drivers/ntb_transport/unbind + echo ntb_transport_edma > /sys/bus/ntb/devices/$dev/driver_override + echo $dev > /sys/bus/ntb/drivers/ntb_transport_edma/bind + + # switch back (optional) + echo $dev > /sys/bus/ntb/drivers/ntb_transport_edma/unbind + echo ntb_transport > /sys/bus/ntb/devices/$dev/driver_override + echo $dev > /sys/bus/ntb/drivers/ntb_transport/bind + +The remote embedded DMA mode uses a different memory window layout from the +legacy shared-memory transport. There is no automatic fallback at runtime: +if the endpoint does not expose a compatible eDMA window, +``ntb_transport_edma`` will fail to attach. In that case, users need to +manually switch back to ``ntb_transport``. + NTB Ping Pong Test Client (ntb\_pingpong) ----------------------------------------- =20 --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020105.outbound.protection.outlook.com [52.101.229.105]) (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 4AC6535503D; Sun, 18 Jan 2026 13:55:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744560; cv=fail; b=jkiqdQosjmqW0c8LKrs4xPPwNqR1Rp9vsFjOesa3+DjAEtmzEXHd4SIsoeHxjDrLwAFCkfg5jjDF+yHDH7NIa/UciN7EfNmFEH31gKW+xC7mwMCQxkNyzfyf5s+yIzWiC5rfzr2Grp+EysHDZ+DxRZBeMm4RuGBPn6HRu+Nm5X8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744560; c=relaxed/simple; bh=YVdnHgukbTjGy9ZuSEPmcJdnE9Pxh8RckKZoie4rV04=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=XC49/QDRvchPVgIyx9PwrLzNL1KlNKGeAkwurQl7fSZD+ei7eZBZz7k6YRDU0GP9zBrNSX5/qEKor4zGVgzlqxoHhxv1MF2JzKw55FeMQS0ZnmkXeFoQ8icFda2XgYrq6MGH6AcmJrKtajqVMb2txi1E+Kf90odlhTwhtZ7qJMY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=MTGlmtY7; arc=fail smtp.client-ip=52.101.229.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="MTGlmtY7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AN3HkOBLhYW3eQWs0+WMW2nT7wIl9TUI4pbPoBCVl62c7oxUz8zr1TUxNLEDcy+QwcC3RqtAoeoVNv3JdbDkgf3H84hiCYdX6ojsbdtgtTxh8Z+jcmruRTlvjRggmrfQxNMK/+VQIHyLU13PhB/dHnfEDFpkVLXZrsTBoTRh3UupnBelZje7FGz3xFIMqNEu2Dkpayk0oZrd6Sxc1AqBcoW5buhuqc8OBVLyTL1uM6/8ciU8iGftVEPI2KH5udAmWFZ4LAR5uJEePOv4eZMrFjSIZkBkrHCstvBLmcXdVzgp0LpZqr9ysYAU/4N3dzc76uj+9JXfi2Nic1FCBGYpQw== 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=vr5TAntOe1KqTU8CWEh2fbZ9UrqenNIZnJpcr9cLzYI=; b=Xshni+Dqczo4YmXt7qidTLOSW26FfvgRPhQzkgfLlNdFZvWUeF0vTQd8686+wH3bQg4Oq0667tzOsyEBaRwvxmP9JqYslQ644y5KocpKDvUyS8Oc8YBFwZjN5mMQpk7qXVwGvYWlmiLG0Ryjq5V5VR1YhLVKtsiWxYVO3x4kbk4/eTsJLQajsbD/VhQAQ87zQq1DqXk2IUad1KJVHH1Z0EWmJ4qUYP/SjNPwCiHGTVUOw0gOGtjvJyQ+hCUI99DXoU4e64olAeRgk5fydP5g0+9SUiYM4U07xWTZBp5xiXtzOPA9PtDnyOXv2S+S50Mxhjf3Xb5viOvJs0LsbeH3FA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=vr5TAntOe1KqTU8CWEh2fbZ9UrqenNIZnJpcr9cLzYI=; b=MTGlmtY7SMd2CLu7TVcTLwJsEacJSq/gGb3hLXN9BcRsSYwfDG3wuKy44bfXQyWdzwBzz4FA+80DiDmG3BoAEzZUroW27H8GYim4QWzxrs/Gh5tLY7rMSjkRuOS/jY56LYOU5SCYPcl6m0xZ3ujxz8WtpLCKKvmkglV7vviTilc= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:48 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:48 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 35/38] PCI: endpoint: pci-epf-test: Add pci_epf_test_next_free_bar() helper Date: Sun, 18 Jan 2026 22:54:37 +0900 Message-ID: <20260118135440.1958279-36-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYWPR01CA0036.jpnprd01.prod.outlook.com (2603:1096:400:aa::23) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: da920d95-4ef7-4bac-20eb-08de5699385b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?r6+RQcTHLBlreemx55TOdwbpWc45ipr7r5X6ePi8nMcHSnx2zGXls9m7lRV+?= =?us-ascii?Q?RQArVyJJhdfwFwGurQEK0Hrc8ZxeRrTy+A6RJ0CU56tqoYNX/85QmX67LFJ7?= =?us-ascii?Q?JAeuHaiB98R+q65GlgHpzcZIlVhxYqDCtYskmT3wNcGhVg2ERk2x0rIcdnA2?= =?us-ascii?Q?yaKu/dxoHWLSwSo2vijNk1wczJeHYCtfyZ/jhw1Nt1ycxrZ2M2es9YJV4ZQb?= =?us-ascii?Q?bdfGbdkhQrwzcRZ3tGPzzDrKYRH8xejNeZJ7H/RrJ6NM1zuklpmNhe5E5fSH?= =?us-ascii?Q?LWBsr9BfND3IbgRHyv6HidyFxT/slbPo0inz7vKi8v2a4QBRfYBxwSWjvqxZ?= =?us-ascii?Q?XT4khZK2KkhtVR5Rzdayo24LGsLjfj+cs6/nnfm8Tc1C3CqgVJQGqA2G7w+Z?= =?us-ascii?Q?WhqspQRRqkyC3kWaPLaKKk6U/PFW1KEl3eHlwY/8QUTEHkkUiYIw4fjoUNIq?= =?us-ascii?Q?0kd9G3mjouPJnCZAgnRhzHSCHR7XFbyIumST5dg+E4X0hmh5Ot64eKx01yln?= =?us-ascii?Q?U1QXxK5tsn32hh/8DfDneSW8oe+WjBSS6mpg2isxwSBtb4Z2PUuHzRKLyb0Z?= =?us-ascii?Q?MiRsMSAjCEEQbJ0cWHhZpzytYHvX4XrFZpabamZ75N91ZpRYo7r3kT9xbBQs?= =?us-ascii?Q?S0u9sYTFpxi53k63x4X225svP5r3TeCXwluUVek3f0FUREn+yygDv4iPWFKt?= =?us-ascii?Q?HUgRwdpuFbxOWqjY3BboaIWjVfZvvjEr24S7roAztQ4jjHQEPNcGd37Go0hR?= =?us-ascii?Q?BkhgYzauxA957D/3fMZIibtsVd3JP1cekuGLb/iB4nOnYjlgf0z0SYOK37SQ?= =?us-ascii?Q?7/W7JF/uvSQFF5pxvEYQrWXOKN5Pbriw5ejGjiGAG4SIQjHX5MGu3i8QgOfC?= =?us-ascii?Q?iP59nKPJgiXbLhnXWYF+3dJQe7wAyRCl18E9mT7jYMNjGp9JCnzOg5untaly?= =?us-ascii?Q?a6A6fWGqCfI/9agbUpnrvsgRQO1jF1ux3vBm4XcLGoLWPdSLoId9VxwrVLAC?= =?us-ascii?Q?h5dNH82Ok7nk6UY7JclKJF9FgdE0l8emWB6178G0zevOJKYySwr8B87BI4Kw?= =?us-ascii?Q?Xwi4w31Xc9yds40OVdZkoirfXJ3PKJ69XnBJjmBCFReGfRCP5YabOhl7DZ4M?= =?us-ascii?Q?SDhh41SQxf9oDn5W5+OBrOAXhLtETHSuxaOc/SUXAZ32qQpFJbiPXTfqEz6a?= =?us-ascii?Q?3gAoxdeXS5YNJcu7z20LE93SDjfsA9aDyLZPOlx9Xcr8QMEc6SvfLCiLoCae?= =?us-ascii?Q?yMIFea3r7uBpy65jye27iY2nmCXjx6WhhP2A9L9uLTukIPo9wMLhZHLAIl5D?= =?us-ascii?Q?M0SksnR2gBTji+2j27rO0g0Wtt+rRxCw5eHW/hKoc6hZDUoADXXjjvwUpf31?= =?us-ascii?Q?6hoS4Bbz7LxX7UxcCxAiogLNWbV9OOcNqRmpNiyqE1WkuVENwMuNosDbCWri?= =?us-ascii?Q?LiLaIccyKFOQo2lwx7J4OWahzauBKpxh9pQ978rQAzsdNWYzo2+QdR1Ty9eU?= =?us-ascii?Q?IORt0h0Tpj0mQCbLiJHp8FB72wDbdce4YN5H6ouYB60rVamKP5JnRhVGJ8IR?= =?us-ascii?Q?UzDhXiWwgY/RjBES0W3XaWvN8NXGhawRoGwD7bukO0WgH5vLOUjxV0fVuDTM?= =?us-ascii?Q?0w=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?VsMgRYpmOUbP9uJd7jT3yvXWgfMammIwrGG9C7QwNlAu5GuQJxcXJB7LtLeI?= =?us-ascii?Q?7xrnrZd8kYLDglXpZbMUZcXxZCOQ9SG4AxLgIAo8jV+Vyc5TjvQIvv9XXUfj?= =?us-ascii?Q?NSHOLb5uEHgf5yUtKys3HeRUl1lD38mRtmvb6xh7CnWB9430j4KNEB/Sqf1h?= =?us-ascii?Q?T6+Ym9OroWh9yjanX1/nfu5R6tMq77i5UvopIy0WjvYu1CIXi62dkxuMT8Rg?= =?us-ascii?Q?yM+pxC7UgRoMSZnbmOAJy/gwxZeEY2UEj7x45N8/6OaorWorHHNjUtbEL3YO?= =?us-ascii?Q?GDhFU4g6cfCoKeBGuLXCL+LobeFYcWZc97Q/gTWdbFkaI02MilwKKuZM5qc6?= =?us-ascii?Q?/qpDl/fZ+4DT2GzDAuv0/h9GML3z6ktS1fm+a3383nH31i7PV2D0VAQ9JC1q?= =?us-ascii?Q?KyReI/048DWu6XiI3QOhmOTiLW38WbGo5tu2Md728jSZO1E6te1fsw6/pAjs?= =?us-ascii?Q?3uBJAyl+zoV5d/Bn6J56xqatoWxSjRZMByvzJSqtBPloKaQO80Jsvdk3NSXh?= =?us-ascii?Q?ZttnVYVtXYzIbQ8cwzpUvEcZMPmaUonZtf7gMKSZDUhUuBOoIq5Dag7g/oGj?= =?us-ascii?Q?ch1mzSHnkN9+1Gdzr7KvWa29/A5DakVYlU9lgSOR6Wntn2NHpxfPu5rTZCQj?= =?us-ascii?Q?vQviuQ3qBKjQ2C7A2/QpWJxfeq2Dwnv6C+UTV1LbByQ15T+Z1bRtv6CKz/bN?= =?us-ascii?Q?Aqel8H+K9ZfI5KmXXRAdHIE5VP1OSO/ToYnAiA+J29UyX8UAbWeSUHG8H1On?= =?us-ascii?Q?wWX3lK+I6Y1xCDqO7JvkeoOnAEZHGCN4Q2oyopJowVEYJ5rOvoHmO7Rec7vo?= =?us-ascii?Q?EVbWKyxx9l4Yi4+L6CzEzgoM6r+FW6PWtZh6VK7pPE6qUNn1Hdvm14pcwMT4?= =?us-ascii?Q?zzrktl3G8Gyi0AIpHHv/f5uJ1m5b4HhvyjdF9GRg96OKNgHJihRkU8Bx2rTz?= =?us-ascii?Q?bZtUU36P1imrig6t1Fuk36vrCI6hsNVwKsIR13jT/G/ECuUPHkRs6nWRhCHo?= =?us-ascii?Q?qoJX+1Vd5RzQayfniCIbTDHyok4129moaAS40aLsw12To+ZGxbJxpOpjghY+?= =?us-ascii?Q?3OGZl7x+7lm4j5eIaUseCmcCj5MIPykPuXamVwK4v8PlU1SRUbjse8RS2aeI?= =?us-ascii?Q?u14ewMheKMrPZHUvnw+cEHFTTIx0hIp4ZzhzbH3cDMBMxL2MmvLCJWtj2xlO?= =?us-ascii?Q?F2uryeTf1FvY6XZHDcULT4bjcuHBi6x41sbecdGOZp9J+pfM4Y9pKP9XrLCg?= =?us-ascii?Q?kmYIpcQv3eMzyj86Sjzk4+vNSXYqPK8vBxrjH+BcdFHyQyQm3OtXRyV4UcJZ?= =?us-ascii?Q?TDrSxXFRuiSA5toFJ+H7djBb0vKmgStSKKpVz+jjx3JJVOjlE3kFssft4JNc?= =?us-ascii?Q?qAOw4cSOXCWyxmz1+42N4yLRXVyN6XS8OhdM1IcwRWSavH1N3AWA09yTji6x?= =?us-ascii?Q?dYNno9kw7JsF8asaV7+e5gIacw61kjgx3ILq93V7JnNB9FvtHEvUaA11I/z1?= =?us-ascii?Q?BoZpVtlazsRO00fltl2ACUWogfARe0uW74v4yF4FKQVfltGUwL1HbD1bCF9N?= =?us-ascii?Q?LKmnMJ/qZnOX9bJ7g1azLB8tNc/AiI/1cpA8nnDZEyN8eL/9pwPWD3P/2ibo?= =?us-ascii?Q?L+Iya3Q3q4avj8rKsur45WvhiQkEPN16KQMPQPj4Ux5NeqQ3X0HJwCQ2L0vk?= =?us-ascii?Q?espxPEROXYLCMEQEY30HE8ROkMZ12jDJJRYZzSKTK3BtwioJmJSf3CYZxsTF?= =?us-ascii?Q?272qBm6Rc49rwO93eyXCiSvI29MdTMOd12t5/jhmYOyIZu8Y8ydf?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: da920d95-4ef7-4bac-20eb-08de5699385b X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:20.9092 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: TOBetW6Mh5hubHH2kIpqrWdZS6aMf8G8ky/v6m3kknfDOitnmNv66B5Tm4XY7Lu9Bl1frpkM8atOIWPmt9bWCA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Introduce pci_epf_test_next_free_bar(), a small helper that wraps pci_epc_get_next_free_bar() and tracks the next starting BAR number. Use it for selecting the test register BAR and the doorbell BAR. An upcoming extension needs to reserve an additional BAR, and this helper will help keep the code compact with the selection logic being centralized. No functional change intended. Signed-off-by: Koichiro Den --- drivers/pci/endpoint/functions/pci-epf-test.c | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/en= dpoint/functions/pci-epf-test.c index 6ecbc2c2ff36..e560c3becebb 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -64,6 +64,7 @@ struct pci_epf_test { void *reg[PCI_STD_NUM_BARS]; struct pci_epf *epf; enum pci_barno test_reg_bar; + enum pci_barno next_free_bar; size_t msix_table_offset; struct delayed_work cmd_handler; struct dma_chan *dma_chan_tx; @@ -104,6 +105,18 @@ static struct pci_epf_header test_header =3D { =20 static size_t bar_size[] =3D { 512, 512, 1024, 16384, 131072, 1048576 }; =20 +static enum pci_barno pci_epf_test_next_free_bar(struct pci_epf_test *epf_= test) +{ + enum pci_barno bar; + + bar =3D pci_epc_get_next_free_bar(epf_test->epc_features, + epf_test->next_free_bar); + if (bar !=3D NO_BAR) + epf_test->next_free_bar =3D bar + 1; + + return bar; +} + static void pci_epf_test_dma_callback(void *param) { struct pci_epf_test *epf_test =3D param; @@ -721,7 +734,7 @@ static void pci_epf_test_enable_doorbell(struct pci_epf= _test *epf_test, goto set_status_err; =20 msg =3D &epf->db_msg[0].msg; - bar =3D pci_epc_get_next_free_bar(epf_test->epc_features, epf_test->test_= reg_bar + 1); + bar =3D pci_epf_test_next_free_bar(epf_test); if (bar < BAR_0) goto err_doorbell_cleanup; =20 @@ -1110,13 +1123,14 @@ static int pci_epf_test_bind(struct pci_epf *epf) dev_err(&epf->dev, "epc_features not implemented\n"); return -EOPNOTSUPP; } + epf_test->epc_features =3D epc_features; + epf_test->next_free_bar =3D BAR_0; =20 - test_reg_bar =3D pci_epc_get_first_free_bar(epc_features); + test_reg_bar =3D pci_epf_test_next_free_bar(epf_test); if (test_reg_bar < 0) return -EINVAL; =20 epf_test->test_reg_bar =3D test_reg_bar; - epf_test->epc_features =3D epc_features; =20 ret =3D pci_epf_test_alloc_space(epf); if (ret) --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TYVP286CU001.outbound.protection.outlook.com (mail-japaneastazon11021096.outbound.protection.outlook.com [52.101.125.96]) (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 B1ED1355803; Sun, 18 Jan 2026 13:55:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.125.96 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744562; cv=fail; b=XN7OcHIPDb3ElxImJhnj2w/4Wydybtdw0AfprVbcwxbu2/qbnDnrA/+UpaPeH8cmVnDtdpRH0LvBUWDN79G3iWqqfIHkQP0q4EEKKNLIA/QX5imxItMFgflkziQ5BpIMxoEWzBPfu9zSOSAv9vcTRvr83CbebMF/9w6A2okCyRA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744562; c=relaxed/simple; bh=MVwPZuZYEpSG3ra6ABX3PUl45GDo33m41PSL4rh0d3c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=U7Eccx/dPijK1++AdkubUOha47311fyEFF8rk7x+rC5igUFDKgmWOZQFNOMu4DXV8I+2GjavtxZY291Px8+waKs41pNmMGQ4CIjyJIAwPT6X06Cao5u5ynVN73oNYnHB0J1xQ09Tixi0rJZU1uuX1xwjWdA7x4LfVM/G9ySDxy8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=JcWvAA/5; arc=fail smtp.client-ip=52.101.125.96 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="JcWvAA/5" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=w7FRzkpzf4LIXqA5Kb/TCHXiDQ/+UVCKxXvB6U1RpDdjOY0d6LzmQptSIAIgj35sZGBUuEafmeH1DPxp6JyxL3v7pq6XYLAFXAExyN6b17KXhRhZCkG9LSN2ei/oLQy9rVukEF4Txfsh0X+XU6HuExWdhvCWtXjo+F9UIrDcqBwwgNfgvQ4YOvAvwC0aFxW+lz25XXFTpiC5p0nTNp8WN3qKpkWpXidncETKaON8+CyBriCr6eLlSQh6sHXoiOnZkra7Hee2s5yZ1bEallZ7MM7ar5jczHkM72Wocui4EvhyFO3kwbFIungKGam8i5J8cfBTif0gSy30Pwfa1uS0Gw== 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=kfi79sfUOdAnx8ZsNbiXW15ZQ35ni+Hpcru6fYrwKvo=; b=V0X/lFzEP5sx+ZgfQfR1dzt4C2P2tjxfMcUDu9PibS6cQFHpx3XapDA1uUUCPh/UxyNO4KGxeA117ONUqoKPIzdHvOhFEq7cgymZcE73J3eq1Z7flkC94lwfhVOA0raJOazjyPaTblb85wDDf6Hrt6Dfq+9x/8VIQPVIifWoHO7Z6jvO18wYcNqg55SOWPurXmXTp2J9jnIEV6OLV7cXWyRWhVN0I6NpthucyNeoskA6hWNX+WpMZWEM6yxqk5yBgryK049z6WvkI4TjQVtZkYdI4aGZdhyfYWmZ0+HHXKpxdBaLm7lxXwqkJO+yzDrrPYAmlY7gZHVDlClI209q2g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kfi79sfUOdAnx8ZsNbiXW15ZQ35ni+Hpcru6fYrwKvo=; b=JcWvAA/5Mv2nY+iK8Ri1mTy9WIFYsNmFONzHG5t/OxhajLnY0TL5tn3RYZqakOQSYxysPNnA1s1R+Vh4ReXm60+J+x8URW1DsUKsFOtfupmO5TY+TBrPdAdHqxOxwfHz40Wb17ya3yRPNsqXmZ6YGNhjyL1F3vR40+TDfi4yhiA= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:48 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:48 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 36/38] PCI: endpoint: pci-epf-test: Add remote eDMA-backed mode Date: Sun, 18 Jan 2026 22:54:38 +0900 Message-ID: <20260118135440.1958279-37-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0102.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:380::16) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: ebca2904-09bd-4ee8-2e98-08de569938cf X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020|18082099003; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?AhJFMcH+imY+eGvaqFOizAbPT6NkaBsKQeV4IkXXHU9Jui5tDXYEFqJ26PVR?= =?us-ascii?Q?PoLUKIq9qWI6kM+tvupLbsebtsT8yqOhzfGtoKmdp/UQZhk9siten9bPVF85?= =?us-ascii?Q?A7Jsk+JTBwHUl8TrsOgCC9ILQH29C0TCqK3dAYi83/GhH5QSPaeHbIJReJEB?= =?us-ascii?Q?ku/Ko4AUpNVj4lt07QKhhD/WHvZPUPQwN4Ncuv+GM2BSvpf5QLJwQV+i5TnM?= =?us-ascii?Q?vliuC8D1fX4ZxJdt3m+mn8yHWyNiJH54zQiA8iRzwuQa5DoUbxso9OHdz+Al?= =?us-ascii?Q?Z1SEoGDvnZvhE/pvDaxL+RaSiT2JTIoH/md0SGhXZqaQS2TLTcHwchk/NlqE?= =?us-ascii?Q?x/No9oTChURfCD3LCYb2isHRIceaEfEqjzvSJPNDmbOBfxHHHnqt9INfi+A3?= =?us-ascii?Q?wAuORlq4+GgqIoF103P3FVZ/jolwN8Ituf7wrN+F5WO0nXzDjFWETkt0o+5J?= =?us-ascii?Q?jIOpO/yKzriXdjhgzaiQqFR+PS5Dy3pryd0AsJouTYfoNtFLbma18AgCQrtF?= =?us-ascii?Q?sjgpoCGocSBz1ic6stZTKv2WKo73H1MUE+r/j2fQGuFrR+JPVqrYep2sY1Vs?= =?us-ascii?Q?5gLBlZDP92b1A8pjCQptdT+kfqOdhR186RJuVWIyeznil8AlcZLZui0/QYWY?= =?us-ascii?Q?Dd4vOuQ74v62o0OaeQTrLjKoQNdTQUQQwU4bnZJl5zoasOIGB7erw0pInFJ8?= =?us-ascii?Q?aKg6c8NC+57738nk/ow/3l78cbvH3OZpurUY1yzv6jLSAIUBBNRdf3udvalB?= =?us-ascii?Q?wYPTGrydvT/TL3nc5rxPM/U2cb+wSmQwl3dcI2MPsvzAeKBARgvEfYRDl61l?= =?us-ascii?Q?vAfacBwAlBZiy39FR8pm8lO5pqgisihuUa/orfsjNFIzMEqAMCap4/sQoyP7?= =?us-ascii?Q?7gQHAoXvQu8uSN633HARqZ+JggYZBmYfWVpOE2lBjepjeKhg5oWQwi9Xghc6?= =?us-ascii?Q?IMzcgdD4eL0z0GEW2vsdqIlJ1qVItrectvW/HjLjsrIouI0V2bDGMsBoHRr7?= =?us-ascii?Q?m/7sd90d1RGbC99al9cte5waTOF9dyzB0UTJY9gijqHVfIA8FdrR1HhDNu2R?= =?us-ascii?Q?ORVswRbZIcghDEFNhJbDPMltsa2q0WcPI6gLnIQIjrp593LLdFARUaE511yH?= =?us-ascii?Q?0G4sVsxfwHg23uHRKgt/wIbPdCSc9gW45rBFGPvgTwxbYLUyClEgXAH1W/AN?= =?us-ascii?Q?ZwBJDbDagy7+PkVblkAZJYGU/gXhNv0FUjjNLQh1+4dlGWDU3OA6oAWHYzMZ?= =?us-ascii?Q?92hIME5lDspEockHh6jnzl8DpCJCdfIv6ujO0Nc0YhiOhztbYDNzIwTkupAv?= =?us-ascii?Q?1t1nYDYvc/tX3JLb+qb/Itgi1jsBTtaU7kaAJv0quhbSYsi5bRyRPeYzTqbz?= =?us-ascii?Q?3C+kB+2xDU13LxxxppLTs4wCqexO9V9vYaO4QhNuTgBehebTFKWwXMClybyG?= =?us-ascii?Q?ypDWEktNwa2hVeh2ZcAkIQEhTVtNyUKQIURQ4noVzRg8iIunON6QKQ/QgQAe?= =?us-ascii?Q?s/S6Mvi2e8BWkp4Q4zwi9o1TctEOngXmvC+w/CKKq4s+LhtouuCGSM8lJOYm?= =?us-ascii?Q?Br3ctw4jvs8bR2m/S+nnTQY9uQh8sV8JuKbPUJ2q9uAxvOaIEzzWA7AY0XX4?= =?us-ascii?Q?tg=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020)(18082099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?s0cYtpIMPX8FahMFdeWMbiQ6ekLFdY8Cl15mHd5oQ79g21/yBVYi88QeprUb?= =?us-ascii?Q?i5mVIFGKKkhF5vvrld3i2AHgriwfnzSMtTBPtA8p5FbqKnpkHcf+oUwN9uYI?= =?us-ascii?Q?3oBhaX15DQcpkaf7nhNji+pUUHFY8Di9VFN7NZnZ25/50/9oMOerzbgJbft8?= =?us-ascii?Q?jKMDKk9v4YWTD7BXdcbp19ZJpda/l9pQxWXoFL/HPyBehx858kjfC6qQ8YNM?= =?us-ascii?Q?56lksjtiChl2SDdNtNDHlN9LvZsnS/9JQ0GPEihl+LFlQYeyJMnkkJ40hcVi?= =?us-ascii?Q?BM4cDXEQy9daRBYtt4dVRZXWf+R10/GAE7Y9Pfc1b4zbUaIn2erl6uQwkffO?= =?us-ascii?Q?NNcrhaWYUTlk72c1FHU+km2UJlcsC4fOaGz192TBG71MhW8NC1Fs7BrwSly2?= =?us-ascii?Q?h/v+uPm4hexsY79F2QsG06Ap+hcsw6d4uU4TiqkCasuZvI9mcjUpBG0Lm1Kt?= =?us-ascii?Q?KnUgtkOznDrkVFP2xehAgiedcTwEGUM1LMoCVOxBwVdhvAPbHAfA1JFIJe+W?= =?us-ascii?Q?hfRZYrC3dYMbO9LT1AXRbL1d8w6M4Ugtd6HXiNHf76MMxm5Kyim0Wx8+DPWi?= =?us-ascii?Q?EJjBgwLymenSZtskU/Arh2e8KljQMP0gGdjyd5yUVE4Lt5XuRrBBM2RU4w83?= =?us-ascii?Q?lU/HeOAmuI3IzuqHInO6Xl1JaFpuZoLaVaRAyEj0kY1NaI5dd+RAykwBUYt3?= =?us-ascii?Q?yFsKJ/PTjhwHW4ZP3/yHP8HmCqDOcpGNKpVD5XG0T0AfskZ7+7spDqT3YiQf?= =?us-ascii?Q?sHotkN0h6ELzLJ1SG/ecW7X9zIfEvpP9FzjbrDt4OlljteKcnGuiVAuO4fi+?= =?us-ascii?Q?MJsvgehYtaVbdNlx8p+6BO2u0sg/o4R4Rp2HcC/lM8yz4Kq21po13yXsVn6q?= =?us-ascii?Q?33gjFx/21YRvd7Z+d2UCwpg6CaMcto6Wgr/NPkmnaQqC4+y+Vp4sqiwxAFR0?= =?us-ascii?Q?KE5LYe2fjqIbv6ZM9vhjNzJte8r4/fscxzqoX9DU38rybIJQyCnsAGHtHoH4?= =?us-ascii?Q?ee/Pdx67r5frgN6uIxRzfPXbwYjrpd4FFd7KXbZachKLKc71QZU+LeFjC8Xi?= =?us-ascii?Q?e4g4zyIBtnx/GwCqQ5jBVxlSUys7pGIxw5zEmVsw9AiqmZtxJ40qRg311fzq?= =?us-ascii?Q?+5Lb2mDXxt8SHkLRTN7nulmrBOCjJOE/tdFAGAy9z1ghe6fElfl3hHGnP1JS?= =?us-ascii?Q?mym95TJSwvvh8x6OkOnD/5k0dhgn5c0d+9PzbJ8GjxhFECMYZkMSdHW3Ubia?= =?us-ascii?Q?HxMb8obEeL2Py/qZJCdIqZpdDsCW/WO0CbiR32d2JIGrHIXV+Uk9M3EAfSMw?= =?us-ascii?Q?EP2JOv9V50hl+TP+LfoL4aAvySWySGFjERjQJtFQk41HJn6ODU05pMdDr3ym?= =?us-ascii?Q?sVHp6nE+kDUGsi29svocndXH6Ew6OmCeR2SlMKPoc5M1HpvjkMJAYHNkMxy6?= =?us-ascii?Q?j4hscWJ4ormnoYwx0Qlc0I+uJqsenQO1qapBP40Ewkpro6z+Z9BkI1Xj1Q6I?= =?us-ascii?Q?56gcugOL7IK/oOsT1Nqv/Tt2TN3VQBdsIlMbetmuNkr2ZcycZHkLZaPazpmZ?= =?us-ascii?Q?/0fyaXWA3i/q8F2BUqcLZ6mddUfPnP+PifBGzHYtzuVGWlpyV5UIXhA/48AZ?= =?us-ascii?Q?AWxXlW6BRJ+EcA+cE79L8e0yz88zgHM/WcSgoCWh+W68EtQbSJyS/HyUAPfB?= =?us-ascii?Q?hDA1/0kMbpwXiwoJ0endU8Jq+K9MqqxFhMsScY0PXliuFZjDx/TaFJUj3Ur1?= =?us-ascii?Q?cQU1qSdqbzuIIws+bmK0fTh3JQWlYPpbyeffZUjtZoV2Y0Bh5XYC?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: ebca2904-09bd-4ee8-2e98-08de569938cf X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:21.6738 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ANluYPIADkgQVRSKbXOWBr+J66hZDmvsbsjx+rjm3OqidfSYEC2ZguPsf6BBqrkro/O0GIIhJhHMzXCTzpPW2w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Some DesignWare-based endpoints integrate an eDMA engine that can be programmed by the host via MMIO. The upcoming NTB transport remote-eDMA backend relies on this capability, but there is currently no upstream test coverage for the end-to-end control and data path. Extend pci-epf-test with an optional remote eDMA test backend (built when CONFIG_DW_EDMA is enabled). - Reserve a spare BAR and expose a small 'pcitest_edma_info' header at BAR offset 0. The header carries a magic/version and describes the endpoint eDMA register window, per-direction linked-list (LL) locations and an endpoint test buffer. - Map the eDMA registers and LL locations into that BAR using BAR subrange mappings (address-match inbound iATU). To run this extra testing, two new endpoint commands are added: * COMMAND_REMOTE_EDMA_SETUP * COMMAND_REMOTE_EDMA_CHECKSUM When the former command is received, the endpoint prepares for the remote eDMA transfer. The CHECKSUM command is useful for Host-to-EP transfer testing, as the endpoint side is not expected to receive the DMA completion interrupt directly. Instead, the host asks the endpoint to compute a CRC32 over the transferred data. This backend is exercised by the host-side pci_endpoint_test driver via a new UAPI flag. Signed-off-by: Koichiro Den --- drivers/pci/endpoint/functions/pci-epf-test.c | 477 ++++++++++++++++++ 1 file changed, 477 insertions(+) diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/en= dpoint/functions/pci-epf-test.c index e560c3becebb..eea10bddcd2a 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -33,6 +34,8 @@ #define COMMAND_COPY BIT(5) #define COMMAND_ENABLE_DOORBELL BIT(6) #define COMMAND_DISABLE_DOORBELL BIT(7) +#define COMMAND_REMOTE_EDMA_SETUP BIT(8) +#define COMMAND_REMOTE_EDMA_CHECKSUM BIT(9) =20 #define STATUS_READ_SUCCESS BIT(0) #define STATUS_READ_FAIL BIT(1) @@ -48,6 +51,10 @@ #define STATUS_DOORBELL_ENABLE_FAIL BIT(11) #define STATUS_DOORBELL_DISABLE_SUCCESS BIT(12) #define STATUS_DOORBELL_DISABLE_FAIL BIT(13) +#define STATUS_REMOTE_EDMA_SETUP_SUCCESS BIT(14) +#define STATUS_REMOTE_EDMA_SETUP_FAIL BIT(15) +#define STATUS_REMOTE_EDMA_CHECKSUM_SUCCESS BIT(16) +#define STATUS_REMOTE_EDMA_CHECKSUM_FAIL BIT(17) =20 #define FLAG_USE_DMA BIT(0) =20 @@ -77,6 +84,9 @@ struct pci_epf_test { bool dma_private; const struct pci_epc_features *epc_features; struct pci_epf_bar db_bar; + + /* For extended tests that rely on vendor-specific features */ + void *data; }; =20 struct pci_epf_test_reg { @@ -117,6 +127,454 @@ static enum pci_barno pci_epf_test_next_free_bar(stru= ct pci_epf_test *epf_test) return bar; } =20 +#if IS_REACHABLE(CONFIG_DW_EDMA) +#include + +#define PCITEST_EDMA_INFO_MAGIC 0x414d4445U /* 'EDMA' */ +#define PCITEST_EDMA_INFO_VERSION 0x00010000U +#define PCITEST_EDMA_TEST_BUF_SIZE (1024 * 1024) + +struct pci_epf_test_edma { + /* Remote eDMA test resources */ + bool enabled; + enum pci_barno bar; + void *info; + size_t total_size; + void *test_buf; + dma_addr_t test_buf_phys; + size_t test_buf_size; + + /* DW eDMA specifics */ + phys_addr_t reg_phys; + size_t reg_submap_sz; + unsigned long reg_iova; + size_t reg_iova_sz; + phys_addr_t ll_rd_phys; + size_t ll_rd_sz_aligned; + phys_addr_t ll_wr_phys; + size_t ll_wr_sz_aligned; +}; + +struct pcitest_edma_info { + __le32 magic; + __le32 version; + + __le32 reg_off; + __le32 reg_size; + + __le64 ll_rd_phys; + __le32 ll_rd_off; + __le32 ll_rd_size; + + __le64 ll_wr_phys; + __le32 ll_wr_off; + __le32 ll_wr_size; + + __le64 test_buf_phys; + __le32 test_buf_size; +}; + +static bool pci_epf_test_bar_is_reserved(struct pci_epf_test *test, + enum pci_barno barno) +{ + struct pci_epf_test_edma *edma =3D test->data; + + if (!edma) + return false; + + return barno =3D=3D edma->bar; +} + +static void pci_epf_test_clear_submaps(struct pci_epf_bar *bar) +{ + kfree(bar->submap); + bar->submap =3D NULL; + bar->num_submap =3D 0; +} + +static int pci_epf_test_add_submap(struct pci_epf_bar *bar, phys_addr_t ph= ys, + size_t size) +{ + struct pci_epf_bar_submap *submap, *new; + + new =3D krealloc_array(bar->submap, bar->num_submap + 1, sizeof(*new), + GFP_KERNEL); + if (!new) + return -ENOMEM; + + bar->submap =3D new; + submap =3D &bar->submap[bar->num_submap]; + submap->phys_addr =3D phys; + submap->size =3D size; + bar->num_submap++; + + return 0; +} + +static void pci_epf_test_clean_remote_edma(struct pci_epf_test *test) +{ + struct pci_epf_test_edma *edma =3D test->data; + struct pci_epf *epf =3D test->epf; + struct pci_epc *epc =3D epf->epc; + struct device *dev =3D epc->dev.parent; + struct iommu_domain *dom; + struct pci_epf_bar *bar; + enum pci_barno barno; + + if (!edma) + return; + + barno =3D edma->bar; + if (barno =3D=3D NO_BAR) + return; + + bar =3D &epf->bar[barno]; + + dom =3D iommu_get_domain_for_dev(dev); + if (dom && edma->reg_iova_sz) { + iommu_unmap(dom, edma->reg_iova, edma->reg_iova_sz); + edma->reg_iova =3D 0; + edma->reg_iova_sz =3D 0; + } + + if (edma->test_buf) { + dma_free_coherent(dev, edma->test_buf_size, + edma->test_buf, + edma->test_buf_phys); + edma->test_buf =3D NULL; + edma->test_buf_phys =3D 0; + edma->test_buf_size =3D 0; + } + + if (edma->info) { + pci_epf_free_space(epf, edma->info, barno, PRIMARY_INTERFACE); + edma->info =3D NULL; + } + + pci_epf_test_clear_submaps(bar); + pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no, bar); + + edma->bar =3D NO_BAR; + edma->enabled =3D false; +} + +static int pci_epf_test_init_remote_edma(struct pci_epf_test *test) +{ + const struct pci_epc_features *epc_features =3D test->epc_features; + struct pci_epf_test_edma *edma; + struct pci_epf *epf =3D test->epf; + struct pci_epc *epc =3D epf->epc; + struct pcitest_edma_info *info; + struct device *dev =3D epc->dev.parent; + struct dw_edma_region region; + struct iommu_domain *dom; + size_t reg_sz_aligned, ll_rd_sz_aligned, ll_wr_sz_aligned; + phys_addr_t phys, ll_rd_phys, ll_wr_phys; + size_t ll_rd_size, ll_wr_size; + resource_size_t reg_size; + unsigned long iova; + size_t off, size; + int ret; + + if (!test->dma_chan_tx || !test->dma_chan_rx) + return -ENODEV; + + edma =3D devm_kzalloc(&epf->dev, sizeof(*edma), GFP_KERNEL); + if (!edma) + return -ENOMEM; + test->data =3D edma; + + edma->bar =3D pci_epf_test_next_free_bar(test); + if (edma->bar =3D=3D NO_BAR) { + dev_err(&epf->dev, "No spare BAR for remote eDMA (remote eDMA disabled)\= n"); + ret =3D -ENOSPC; + goto err; + } + + ret =3D dw_edma_get_reg_window(epc, &edma->reg_phys, ®_size); + if (ret) { + dev_err(dev, "failed to get edma reg window: %d\n", ret); + goto err; + } + dom =3D iommu_get_domain_for_dev(dev); + if (dom) { + phys =3D edma->reg_phys & PAGE_MASK; + size =3D PAGE_ALIGN(reg_size + edma->reg_phys - phys); + iova =3D phys; + + ret =3D iommu_map(dom, iova, phys, size, + IOMMU_READ | IOMMU_WRITE | IOMMU_MMIO, + GFP_KERNEL); + if (ret) { + dev_err(dev, "failed to direct map eDMA reg: %d\n", ret); + goto err; + } + edma->reg_iova =3D iova; + edma->reg_iova_sz =3D size; + } + + /* Get LL location addresses and sizes */ + ret =3D dw_edma_chan_get_ll_region(test->dma_chan_rx, ®ion); + if (ret) { + dev_err(dev, "failed to get edma ll region for rx: %d\n", ret); + goto err; + } + ll_rd_phys =3D region.paddr; + ll_rd_size =3D region.sz; + + ret =3D dw_edma_chan_get_ll_region(test->dma_chan_tx, ®ion); + if (ret) { + dev_err(dev, "failed to get edma ll region for tx: %d\n", ret); + goto err; + } + ll_wr_phys =3D region.paddr; + ll_wr_size =3D region.sz; + + edma->test_buf_size =3D PCITEST_EDMA_TEST_BUF_SIZE; + edma->test_buf =3D dma_alloc_coherent(dev, edma->test_buf_size, + &edma->test_buf_phys, GFP_KERNEL); + if (!edma->test_buf) { + ret =3D -ENOMEM; + goto err; + } + + reg_sz_aligned =3D PAGE_ALIGN(reg_size); + ll_rd_sz_aligned =3D PAGE_ALIGN(ll_rd_size); + ll_wr_sz_aligned =3D PAGE_ALIGN(ll_wr_size); + edma->total_size =3D PAGE_SIZE + reg_sz_aligned + ll_rd_sz_aligned + + ll_wr_sz_aligned; + size =3D roundup_pow_of_two(edma->total_size); + + info =3D pci_epf_alloc_space(epf, size, edma->bar, + epc_features, PRIMARY_INTERFACE); + if (!info) { + ret =3D -ENOMEM; + goto err; + } + memset(info, 0, size); + + off =3D PAGE_SIZE; + info->magic =3D cpu_to_le32(PCITEST_EDMA_INFO_MAGIC); + info->version =3D cpu_to_le32(PCITEST_EDMA_INFO_VERSION); + + info->reg_off =3D cpu_to_le32(off); + info->reg_size =3D cpu_to_le32(reg_size); + off +=3D reg_sz_aligned; + + info->ll_rd_phys =3D cpu_to_le64(ll_rd_phys); + info->ll_rd_off =3D cpu_to_le32(off); + info->ll_rd_size =3D cpu_to_le32(ll_rd_size); + off +=3D ll_rd_sz_aligned; + + info->ll_wr_phys =3D cpu_to_le64(ll_wr_phys); + info->ll_wr_off =3D cpu_to_le32(off); + info->ll_wr_size =3D cpu_to_le32(ll_wr_size); + off +=3D ll_wr_sz_aligned; + + info->test_buf_phys =3D cpu_to_le64(edma->test_buf_phys); + info->test_buf_size =3D cpu_to_le32(edma->test_buf_size); + + edma->info =3D info; + edma->reg_submap_sz =3D reg_sz_aligned; + edma->ll_rd_phys =3D ll_rd_phys; + edma->ll_wr_phys =3D ll_wr_phys; + edma->ll_rd_sz_aligned =3D ll_rd_sz_aligned; + edma->ll_wr_sz_aligned =3D ll_wr_sz_aligned; + + ret =3D pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, + &epf->bar[edma->bar]); + if (ret) { + dev_err(dev, + "failed to init BAR%d for remote eDMA: %d\n", + edma->bar, ret); + goto err; + } + dev_info(dev, "BAR%d initialized for remote eDMA\n", edma->bar); + + return 0; + +err: + pci_epf_test_clean_remote_edma(test); + devm_kfree(&epf->dev, edma); + test->data =3D NULL; + return ret; +} + +static int pci_epf_test_map_remote_edma(struct pci_epf_test *test) +{ + struct pci_epf_test_edma *edma =3D test->data; + struct pcitest_edma_info *info; + struct pci_epf *epf =3D test->epf; + struct pci_epc *epc =3D epf->epc; + struct pci_epf_bar *bar; + enum pci_barno barno; + struct device *dev =3D epc->dev.parent; + int ret; + + if (!edma) + return -ENODEV; + + info =3D edma->info; + barno =3D edma->bar; + + if (barno =3D=3D NO_BAR) + return -ENOSPC; + if (!info || !edma->test_buf) + return -ENODEV; + + bar =3D &epf->bar[barno]; + pci_epf_test_clear_submaps(bar); + + ret =3D pci_epf_test_add_submap(bar, bar->phys_addr, PAGE_SIZE); + if (ret) + return ret; + + ret =3D pci_epf_test_add_submap(bar, edma->reg_phys, edma->reg_submap_sz); + if (ret) + goto err_submap; + + ret =3D pci_epf_test_add_submap(bar, edma->ll_rd_phys, + edma->ll_rd_sz_aligned); + if (ret) + goto err_submap; + + ret =3D pci_epf_test_add_submap(bar, edma->ll_wr_phys, + edma->ll_wr_sz_aligned); + if (ret) + goto err_submap; + + if (bar->size > edma->total_size) { + ret =3D pci_epf_test_add_submap(bar, 0, + bar->size - edma->total_size); + if (ret) + goto err_submap; + } + + ret =3D pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, bar); + if (ret) { + dev_err(dev, "failed to map BAR%d: %d\n", barno, ret); + goto err_submap; + } + + /* + * Endpoint-local interrupts must be ignored even if the host fails to + * mask them. + */ + ret =3D dw_edma_chan_irq_config(test->dma_chan_tx, DW_EDMA_CH_IRQ_REMOTE); + if (ret) { + dev_err(dev, "failed to set irq mode for tx channel: %d\n", + ret); + goto err_bar; + } + ret =3D dw_edma_chan_irq_config(test->dma_chan_rx, DW_EDMA_CH_IRQ_REMOTE); + if (ret) { + dev_err(dev, "failed to set irq mode for rx channel: %d\n", + ret); + goto err_bar; + } + + return 0; +err_bar: + pci_epc_clear_bar(epc, epf->func_no, epf->vfunc_no, &epf->bar[barno]); +err_submap: + pci_epf_test_clear_submaps(bar); + return ret; +} + +static void pci_epf_test_remote_edma_setup(struct pci_epf_test *epf_test, + struct pci_epf_test_reg *reg) +{ + struct pci_epf_test_edma *edma =3D epf_test->data; + size_t size =3D le32_to_cpu(reg->size); + void *buf; + int ret; + + if (!edma || !edma->test_buf || size > edma->test_buf_size) { + reg->status =3D cpu_to_le32(STATUS_REMOTE_EDMA_SETUP_FAIL); + return; + } + + buf =3D edma->test_buf; + + if (!edma->enabled) { + /* NB. Currently DW eDMA is the only supported backend */ + ret =3D pci_epf_test_map_remote_edma(epf_test); + if (ret) { + WRITE_ONCE(reg->status, + cpu_to_le32(STATUS_REMOTE_EDMA_SETUP_FAIL)); + return; + } + edma->enabled =3D true; + } + + /* Populate the test buffer with random data */ + get_random_bytes(buf, size); + reg->checksum =3D cpu_to_le32(crc32_le(~0, buf, size)); + + WRITE_ONCE(reg->status, cpu_to_le32(STATUS_REMOTE_EDMA_SETUP_SUCCESS)); +} + +static void pci_epf_test_remote_edma_checksum(struct pci_epf_test *epf_tes= t, + struct pci_epf_test_reg *reg) +{ + struct pci_epf_test_edma *edma =3D epf_test->data; + u32 status =3D le32_to_cpu(reg->status); + size_t size; + void *addr; + u32 crc32; + + size =3D le32_to_cpu(reg->size); + if (!edma || !edma->test_buf || size > edma->test_buf_size) { + status |=3D STATUS_REMOTE_EDMA_CHECKSUM_FAIL; + reg->status =3D cpu_to_le32(status); + return; + } + + addr =3D edma->test_buf; + crc32 =3D crc32_le(~0, addr, size); + status |=3D STATUS_REMOTE_EDMA_CHECKSUM_SUCCESS; + + reg->checksum =3D cpu_to_le32(crc32); + reg->status =3D cpu_to_le32(status); +} + +static void pci_epf_test_reset_dma_chan(struct dma_chan *chan) +{ + dw_edma_chan_irq_config(chan, DW_EDMA_CH_IRQ_DEFAULT); +} +#else +static bool pci_epf_test_bar_is_reserved(struct pci_epf_test *test, + enum pci_barno barno) +{ + return false; +} + +static void pci_epf_test_clean_remote_edma(struct pci_epf_test *test) +{ +} + +static int pci_epf_test_init_remote_edma(struct pci_epf_test *test) +{ + return -EOPNOTSUPP; +} + +static void pci_epf_test_remote_edma_setup(struct pci_epf_test *epf_test, + struct pci_epf_test_reg *reg) +{ + reg->status =3D cpu_to_le32(STATUS_REMOTE_EDMA_SETUP_FAIL); +} + +static void pci_epf_test_remote_edma_checksum(struct pci_epf_test *epf_tes= t, + struct pci_epf_test_reg *reg) +{ + reg->status =3D cpu_to_le32(STATUS_REMOTE_EDMA_CHECKSUM_FAIL); +} + +static void pci_epf_test_reset_dma_chan(struct dma_chan *chan) +{ +} +#endif + static void pci_epf_test_dma_callback(void *param) { struct pci_epf_test *epf_test =3D param; @@ -168,6 +626,8 @@ static int pci_epf_test_data_transfer(struct pci_epf_te= st *epf_test, return -EINVAL; } =20 + pci_epf_test_reset_dma_chan(chan); + if (epf_test->dma_private) { sconf.direction =3D dir; if (dir =3D=3D DMA_MEM_TO_DEV) @@ -870,6 +1330,14 @@ static void pci_epf_test_cmd_handler(struct work_stru= ct *work) pci_epf_test_disable_doorbell(epf_test, reg); pci_epf_test_raise_irq(epf_test, reg); break; + case COMMAND_REMOTE_EDMA_SETUP: + pci_epf_test_remote_edma_setup(epf_test, reg); + pci_epf_test_raise_irq(epf_test, reg); + break; + case COMMAND_REMOTE_EDMA_CHECKSUM: + pci_epf_test_remote_edma_checksum(epf_test, reg); + pci_epf_test_raise_irq(epf_test, reg); + break; default: dev_err(dev, "Invalid command 0x%x\n", command); break; @@ -961,6 +1429,10 @@ static int pci_epf_test_epc_init(struct pci_epf *epf) if (ret) epf_test->dma_supported =3D false; =20 + ret =3D pci_epf_test_init_remote_edma(epf_test); + if (ret && ret !=3D -EOPNOTSUPP) + dev_warn(dev, "Remote eDMA setup failed\n"); + if (epf->vfunc_no <=3D 1) { ret =3D pci_epc_write_header(epc, epf->func_no, epf->vfunc_no, header); if (ret) { @@ -1007,6 +1479,7 @@ static void pci_epf_test_epc_deinit(struct pci_epf *e= pf) struct pci_epf_test *epf_test =3D epf_get_drvdata(epf); =20 cancel_delayed_work_sync(&epf_test->cmd_handler); + pci_epf_test_clean_remote_edma(epf_test); pci_epf_test_clean_dma_chan(epf_test); pci_epf_test_clear_bar(epf); } @@ -1076,6 +1549,9 @@ static int pci_epf_test_alloc_space(struct pci_epf *e= pf) if (bar =3D=3D test_reg_bar) continue; =20 + if (pci_epf_test_bar_is_reserved(epf_test, bar)) + continue; + if (epc_features->bar[bar].type =3D=3D BAR_FIXED) test_reg_size =3D epc_features->bar[bar].fixed_size; else @@ -1146,6 +1622,7 @@ static void pci_epf_test_unbind(struct pci_epf *epf) =20 cancel_delayed_work_sync(&epf_test->cmd_handler); if (epc->init_complete) { + pci_epf_test_clean_remote_edma(epf_test); pci_epf_test_clean_dma_chan(epf_test); pci_epf_test_clear_bar(epf); } --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from OS0P286CU010.outbound.protection.outlook.com (mail-japanwestazon11021122.outbound.protection.outlook.com [40.107.74.122]) (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 05250356A3F; Sun, 18 Jan 2026 13:56:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.74.122 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744563; cv=fail; b=Pg0L6wwMezAOQOdxfsLsH27wIapZJgiLxAlEKkTWyDzQ8h5FOEpDXMK2ebeKayNKhAwe7orZc3tHIS2zB6zhP34vhi0l+ULxg5W3iAxONDPdb5Azkh3os0hw5HFkiYHTrn+hZI+9GDot6KwBqjxOeUkBGlaVa2A6uPi2R+8VKYw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744563; c=relaxed/simple; bh=PliObw7ITt9wZG5z9s0riRCW6osMpW6/LUn1A8rxark=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=D35lN42YkoRYfLePS3VSW7mO+oJdf327hNcPgtvzeXPbT4klvUsTIG8BFvHfsdG2kuZ+WRO4Lto0qqOaCY05nDrcEsoD4j/J+4pBeZFz32jldb0hqEecjc+L73CJEbNhYZrLQKkCex1PUHn8icSgiwqk1f+kHr3K69hH2Ab0fv4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=r7TkEiAA; arc=fail smtp.client-ip=40.107.74.122 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="r7TkEiAA" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=jf9FLu2/HNf0Inu4k2b1ByYr1lMo3VB1EF+GjIl4SF9CV6cJWvy27ESfNz9OH2IYSCx70vhT48ZvbbrhibXDpqkRA+duTAFv93FBOucgXsskdH3Fxg07VOG1F93RDkrllLHRR7GyLncE6Yx0DistBIb0opINTc4inpUEy2dpc3iO9sPKCMoGT1TZxjBMRvQauAopWElC6edRH0sG8n4+B8+I/sCTa2CyGWFJWvoyNxJnoVuxl3vZkSbNQh6TPb2g9TtCUB1FnADRetxFv3esQdGrcyGOAMPhOPmOo8Ct1j5q1NRvSlvaxbnlSwOQB6UF6nbxrsoM6lJIDZQikTd16w== 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=VwEohNI2VgVjRtwolgshdET/NuOPsD/aCuM1nzBIp+Q=; b=RIPlSwdUcDYeS4wUBRSU4T9XmHOgQZWiDVTpbszcpqKF7F8CKl4qhRcLUTzjf8KKmBlC/ffrNeh5+Jyq9gULq8Ej3IWOunyZc2veIUl5Ru3/vLWhrdnfCzApwcV/stWscxZ/RDNiNkHlq98KEuCUm4Gj7lciWNvL2du5JJeS3Dv6z+Te5U3PgskMjbjMexPzFol0WGX1t0bEtjvA6Uw2PeaNBonoN37R7PIiH7p6qxj2xSLSBTSdNCIBw1Ao10DEoq2h0hn8Nx5G7U3MHOOfzUwMEUFE9kJjUpyIwgvijKUpc4Njl6huLChXEFevQBVYpTDClAvj79X0lMAcyO82SQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=VwEohNI2VgVjRtwolgshdET/NuOPsD/aCuM1nzBIp+Q=; b=r7TkEiAADYdl9g1SM/BAxAiLcFfrUscThrO2xXouHNUG+O3chqax3jpaNtqvzljGjMGiUQB7yLlOIa13hp69Bja5VQdJ6LGIE/e6oCt+41NlfNqNh8xDaeuy4pITT7nex3lXU13T17pA3edT+EuaV1SgLoWqta0rThBp1ZgDfjQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:48 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:48 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 37/38] misc: pci_endpoint_test: Add remote eDMA transfer test mode Date: Sun, 18 Jan 2026 22:54:39 +0900 Message-ID: <20260118135440.1958279-38-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P301CA0075.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:36f::13) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 8dcc5b43-04e8-4497-afa8-08de56993945 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?b8IBbYYXjfZ6VTZMWlN8uO+mmKS/gqmybx9+JIIX5aJ/vmcaRcobK4X9NEQ6?= =?us-ascii?Q?b0e5XbX8bq59ZPdrOckmA6K29SUD7eldualX/Vlfw3ckh7qg8LrHVJ7B/jW5?= =?us-ascii?Q?5QmiQRornrRKsyNIqwz7NWPRRe/g3HnlbNMleYRaVbm3KXx1bTnkYVewgs+Q?= =?us-ascii?Q?WQCssFkvsQyKdFNDGmhXgeMpPlet6FeYfskVdBNgmuZdKLa6dcFomGSGHOKS?= =?us-ascii?Q?30jQZkAOGa5nT1sPRowYB4lpaQDOqAZTJuLHDOkHs2u2ZMX8Ry11oRHZ23t3?= =?us-ascii?Q?Ui0U+gg99i0yLaLVATlRVJ6VYKh93tjbBLY5aRRNlHasUULFRDFd1VAD8DKZ?= =?us-ascii?Q?RRe29XMogP/wNXC8y84zW35VYyEMoVy6U5OGJz2QZ3ZE9GeQqOmY6ZwU9VRK?= =?us-ascii?Q?a9w8FgxqboW9H4RgTvA3lFmGpR0ZQow8cOsd3f85nccaja/W7xX/HmpZpPAu?= =?us-ascii?Q?wDa3TJjCVrP4V6UQjSF/r9yut3MeuEb7mvHCFpxWyXaMBKotCXk/quc88XBr?= =?us-ascii?Q?buxVvZBY4z0zTiLd/gl0nOCMi+/nbO2pdkrCRcssN0xIknMw30U1uN6gvKFk?= =?us-ascii?Q?+o1uYYOmB+WC613gH87zjkXfhGyIS0sTSj6lC02s2KLZLZs3YVmYRSl8v0xM?= =?us-ascii?Q?+BNpptJjQAuxQskxPRg3WdIQs6pvAkXydIdZRCPdGW2iZLWFtzz+TD2sRlIp?= =?us-ascii?Q?5155CGtqOz0dxOJZ0S3OmKjcHMhPIusbogfshoutzPYG1Mom+mYfFusJxNv9?= =?us-ascii?Q?cHX4/684j5ZgAKq8fCM4W1jLj5t2MJY47sb8QIc9exR2qhUUujvyg3N43h+9?= =?us-ascii?Q?HCg/1PGPrdEniscQck4eVtr83DPhM5SJ9EdzZDlA1lbcVLJzkmYZsQyPNeB2?= =?us-ascii?Q?y3KQ/iAjy3fYTuc906hoVZV6av4gOKvOxROTrr9mECA1JY4KoOV+TMO5Rc5X?= =?us-ascii?Q?axPGemlQx44mpvvt0TcQOffFeA3yokgMpNKXj9eP7n8LXIxfze1SI585ZiW3?= =?us-ascii?Q?QfntCA1TbbscxH2+t2Agd7gkFdAVmstmoXMdc+C2k+bt2wFunRzgVRkxVZJW?= =?us-ascii?Q?/EiQQohknbmVfq8q/h2lt8oeQOKlhLOPWmM42Ahn0kmaaXFPqB7PrefwKtLB?= =?us-ascii?Q?UQ4tsU3DEx/tHAQVF/VU5+zxTZx6OBxDjzDkgVKA8bm4oFp+XrWo9hcSb/xF?= =?us-ascii?Q?Rs5SHSy1HfcooqwGzWCLeAPGxkn4s4iUrykmxq3GsknzB/va0mDdKWOMsgHz?= =?us-ascii?Q?Fc5DvSp4XuEDR6wtXOr4WYtpEuCPVGir57KWfAbAzSxsi2pCJO7b2NHIXTBu?= =?us-ascii?Q?9aaKzJZu6ci5mYVb0mx9Vphtu/OlMryKbW3BllzXwXtqLMy2MYWPv7I5bb3S?= =?us-ascii?Q?cWJ0I2nRzrituAMWP75MQsHcJyMllKhwmK0D/+utepm1SmC8AC8CyMPm24uv?= =?us-ascii?Q?6Xh7rCjrLFFUulUbKz5TyGQN36NyYPmhi0NTrXqPlUZadVvF6J1jRYcPORuq?= =?us-ascii?Q?dwvYuYDMLMZXa7zVg+kVCUc+TorpHEucyWb2ybnOjV+/CMVkq7WSd3eudXrD?= =?us-ascii?Q?IVt6PM2Zaia+TDNHpb6yHSzDmhN0AQ82iMEiGfQ868HBBJ9FDXrkvYr4KK0W?= =?us-ascii?Q?KA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?5z3xShoQLEx+EO4iw4mnU9NqBOArob6OqNnseORrqPR3e39U2aauML2TulJM?= =?us-ascii?Q?m56AdrXyQEeCVX/+Nux11bqk9CKvCH6IegtAePUVgfX0cMJYE7PxGvdBLB9K?= =?us-ascii?Q?xSEqx8FIQZHa6l2a6l+b7TIwzYvo7ssWgkbLIQMdqN10qg3thfClQMVLJocJ?= =?us-ascii?Q?z7FybpNpp/BC6gnfW/8eru+wpTevRbU3SuvH1gXZPZ0ubUJ+R8wks4pJ7qHk?= =?us-ascii?Q?FEGAA/4cEv8LqDrseCiPolgC20pCRO5d08wFUZmKiX3GFJCpqm9b/Jc5LEyd?= =?us-ascii?Q?QgPi0Uih+HX3/xPC568coAX9FYG3dajXiD6Pdzub5Na4o1qzUu1ZHU8KbaZu?= =?us-ascii?Q?9qKeeDcnzMvbsHfPbIjgDkLa3XYgQKc3anSsxMh2xQKIhtJg+BoEDxfjjco0?= =?us-ascii?Q?W6wJdhwnmZisSO72HtgfScPyhlUDGj2vljt8a0emjPwtd6WZ8oSDwECOMZ4F?= =?us-ascii?Q?mHuBdSiRfI69rmCN8Bmy/NFWNT/h51n2v4UFbx1etHEaD1VvxaUAQ/bBzVrI?= =?us-ascii?Q?VOjuev/SW9RZSjFUjLoB2/o9bzqhx5chD5iHYiqBbtnfpF84ovamW/+BG9+H?= =?us-ascii?Q?Jhx1Bu0zMckYdgrfDwGH5EU+gw6HmtjbJ3uc78qIhHmW0DU98W7ISUxe2uuf?= =?us-ascii?Q?hDL721Nv5FKghwPFY4ea7/eLa0uCqLpYfZIkaFeh1ciCfZVvJZSur+iOLle6?= =?us-ascii?Q?BuSARjt5XJyYucnrfUmhT141purSgrENRQguUQah5dJmhefk9a4i/k2G/fD8?= =?us-ascii?Q?01+m0xC6k/gUcJqy5x0UK5WcCHSuaBwAC8AVfXCaszVL/4peHznpdsj1vvJS?= =?us-ascii?Q?SB1mgyDhPU9P5TlSLPJeT+4L1Qs/Z+mWE9OQRVwmDrJaZvTkhKefyG6/ptJx?= =?us-ascii?Q?0FU199727FmTzkXzhS7fzHouKwgCaj9HmsolRGTVwFzW/I7nayJLqdSXWmin?= =?us-ascii?Q?RPfyNFj3AdS4GoJrC/QDLHpctoCPXd1G5OSXFrGpMv0hBRK5Pz4W7IUARdHU?= =?us-ascii?Q?rxRsoOhcjrzXkjUCFrgefbugRPt2Z1J1yH3K78w5S8O1QRXKfe45hwTf1iRv?= =?us-ascii?Q?7wo0eQv54X27iRaJbocW0jZXJbixsx1e8MamKF1cC2qv6HbnC/fQaMsra5jR?= =?us-ascii?Q?34M0kAZVgz+B9Srk0ZIk9mgvLVVA0D5+qd+X6wWq7VdjuoFX3z+aGyc9YpWl?= =?us-ascii?Q?zEh+rfA1ObcB//d1t1U/Azv6/PhoGIT92vybsBoW3/O1UD6AK2lbKp6iYeUD?= =?us-ascii?Q?QIGQSp/bummSmgfH3/oaBAzDB6vSgnL4ApxGDY82n3lQ0irT5f8QqEByEah7?= =?us-ascii?Q?X4oavOBzHbO+H9X+fXN9HK5/lXZnUoNbLx+8X3cyhlZIjfofI869FzK9I/bw?= =?us-ascii?Q?5NoyaISyaGc25iFWFUd4FVqs+K7SN2mF3yPw7ILc0boyZ6tweQCGIxpwdZGS?= =?us-ascii?Q?AwDnxgMpP6eJmvkSp5I1jV7GRbjavXAqf/QOxGJGLxGWVI92Cb0ZmFzaCB1j?= =?us-ascii?Q?e4pY750J6WE5OG4/31VOOe1wazRpImLWrFrW1v7Hep980QIBxycQdQEdtSyA?= =?us-ascii?Q?Uq0/q46vemgP1J7tc0p3xg9NPrIXXSu/W71CSwwB3J18b26f+9a1NT5zuLa9?= =?us-ascii?Q?ZmLB7cwdBA/QVWDWBtH5cBvlSKWdzmahnfpmyIceTKSxEP8wFFvLXZOY2LwO?= =?us-ascii?Q?Pl0iODmC4Np196T2QvNwTv/K4muHgOGQSbRsPlXbJROl6vi482P72jqbNz4f?= =?us-ascii?Q?fbDW94ZreVgmi/0PTr7kgcP4LBscSjes73F3XTqT1VXKtU4j1+FV?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 8dcc5b43-04e8-4497-afa8-08de56993945 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:22.4553 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 6JBvEHVNqqmPLMrHGFCL2XJEruwKlFpKPQYIw94jOzbhFBO+6yJf1akBdItZjhqY5quhe+QAtdGlfn5T1LcGwA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Add a new test mode controlled by a flag, PCITEST_FLAGS_USE_REMOTE_EDMA. When requested, the driver: - Issues COMMAND_REMOTE_EDMA_SETUP to the endpoint and locates the BAR containing a pcitest_edma_info header (magic/version). - Creates a remote dw-edma instance by ioremapping the endpoint's exposed eDMA registers and linked-list regions and probing dw-edma on top of it. - Requests one DMA_SLAVE channel per direction and performs the transfer. - Uses COMMAND_REMOTE_EDMA_CHECKSUM to validate the result when the transfer direction is host-to-endpoint. For the opposite direction, the endpoint provides the expected checksum up front. One MSI/MSI-X vector is reserved for the remote dw-edma instance by freeing the last test IRQ vector. This keeps existing MSI/MSI-X tests unchanged unless the remote-eDMA mode is invoked. BAR read/write tests skip the BAR reserved for remote-eDMA metadata to avoid corrupting the eDMA window. Signed-off-by: Koichiro Den --- drivers/misc/pci_endpoint_test.c | 633 +++++++++++++++++++++++++++++++ include/uapi/linux/pcitest.h | 3 +- 2 files changed, 635 insertions(+), 1 deletion(-) diff --git a/drivers/misc/pci_endpoint_test.c b/drivers/misc/pci_endpoint_t= est.c index 1c0fd185114f..52d700374ac6 100644 --- a/drivers/misc/pci_endpoint_test.c +++ b/drivers/misc/pci_endpoint_test.c @@ -8,7 +8,10 @@ =20 #include #include +#include #include +#include +#include #include #include #include @@ -17,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +43,8 @@ #define COMMAND_COPY BIT(5) #define COMMAND_ENABLE_DOORBELL BIT(6) #define COMMAND_DISABLE_DOORBELL BIT(7) +#define COMMAND_REMOTE_EDMA_SETUP BIT(8) +#define COMMAND_REMOTE_EDMA_CHECKSUM BIT(9) =20 #define PCI_ENDPOINT_TEST_STATUS 0x8 #define STATUS_READ_SUCCESS BIT(0) @@ -55,6 +61,10 @@ #define STATUS_DOORBELL_ENABLE_FAIL BIT(11) #define STATUS_DOORBELL_DISABLE_SUCCESS BIT(12) #define STATUS_DOORBELL_DISABLE_FAIL BIT(13) +#define STATUS_REMOTE_EDMA_SETUP_SUCCESS BIT(14) +#define STATUS_REMOTE_EDMA_SETUP_FAIL BIT(15) +#define STATUS_REMOTE_EDMA_CHECKSUM_SUCCESS BIT(16) +#define STATUS_REMOTE_EDMA_CHECKSUM_FAIL BIT(17) =20 #define PCI_ENDPOINT_TEST_LOWER_SRC_ADDR 0x0c #define PCI_ENDPOINT_TEST_UPPER_SRC_ADDR 0x10 @@ -130,6 +140,9 @@ struct pci_endpoint_test { size_t alignment; u32 ep_caps; const char *name; + + /* For extended tests that rely on vendor-specific features */ + void *data; }; =20 struct pci_endpoint_test_data { @@ -149,6 +162,610 @@ static inline void pci_endpoint_test_writel(struct pc= i_endpoint_test *test, writel(value, test->base + offset); } =20 +static irqreturn_t pci_endpoint_test_irqhandler(int irq, void *dev_id); + +#if IS_REACHABLE(CONFIG_DW_EDMA) +#include + +#define PCITEST_EDMA_INFO_MAGIC 0x414d4445U /* 'EDMA' */ +#define PCITEST_EDMA_INFO_VERSION 0x00010000U + +struct pci_endpoint_test_edma { + bool probed; + void __iomem *bar_base; + int irq; + + /* Remote dw-edma instance */ + struct dw_edma_chip chip; + + /* One channel per direction */ + struct dma_chan *m2d; + struct dma_chan *d2m; +}; + +struct pcitest_edma_info { + __le32 magic; + __le32 version; + + __le32 reg_off; + __le32 reg_size; + + __le64 ll_rd_phys; + __le32 ll_rd_off; + __le32 ll_rd_size; + + __le64 ll_wr_phys; + __le32 ll_wr_off; + __le32 ll_wr_size; + + __le64 test_buf_phys; + __le32 test_buf_size; +}; + +struct pci_endpoint_test_edma_filter { + struct device *dma_dev; + unsigned long direction; +}; + +static bool test_edma_filter_fn(struct dma_chan *chan, void *param) +{ + struct pci_endpoint_test_edma_filter *filter =3D param; + u32 dir =3D filter->direction; + struct dma_slave_caps caps; + int ret; + + if (chan->device->dev !=3D filter->dma_dev) + return false; + + ret =3D dma_get_slave_caps(chan, &caps); + if (ret < 0) + return false; + + return !!(caps.directions & dir); +} + +static int pci_endpoint_test_edma_irq_vector(struct device *dev, unsigned = int nr) +{ + struct pci_dev *pdev =3D to_pci_dev(dev); + struct pci_endpoint_test *test =3D pci_get_drvdata(pdev); + struct pci_endpoint_test_edma *edma; + + if (!test) + return -EINVAL; + + edma =3D test->data; + if (!edma) + return -EINVAL; + + /* + * Only one vector is reserved for remote eDMA use, thus 'nr' is + * ignored. See pci_endpoint_test_edma_reserve_irq(). + */ + return pci_irq_vector(pdev, edma->irq); +} + +static enum pci_barno pci_endpoint_test_edma_bar(struct pci_dev *pdev) +{ + int bar; + + for (bar =3D 0; bar < PCI_STD_NUM_BARS; bar++) { + void __iomem *base; + u32 magic; + + if (!(pci_resource_flags(pdev, bar) & IORESOURCE_MEM)) + continue; + if (!pci_resource_len(pdev, bar)) + continue; + + base =3D pci_iomap_range(pdev, bar, 0, sizeof(u32)); + if (!base) + continue; + + magic =3D ioread32(base); + pci_iounmap(pdev, base); + + if (magic =3D=3D PCITEST_EDMA_INFO_MAGIC) + return bar; + } + return NO_BAR; +} + +static bool pci_endpoint_test_bar_is_reserved(struct pci_endpoint_test *te= st, + enum pci_barno barno) +{ + struct pci_dev *pdev =3D test->pdev; + enum pci_barno edma_bar =3D pci_endpoint_test_edma_bar(pdev); + + return barno =3D=3D NO_BAR || barno =3D=3D edma_bar; +} + +static void pci_endpoint_test_dw_edma_cleanup(struct pci_endpoint_test *te= st, + struct pci_endpoint_test_edma *edma) +{ + if (!edma) + return; + + if (edma->m2d) { + dmaengine_terminate_sync(edma->m2d); + dma_release_channel(edma->m2d); + edma->m2d =3D NULL; + } + + if (edma->d2m) { + dmaengine_terminate_sync(edma->d2m); + dma_release_channel(edma->d2m); + edma->d2m =3D NULL; + } + + if (edma->probed) { + dw_edma_remove(&edma->chip); + edma->probed =3D false; + } + + if (edma->bar_base) { + pci_iounmap(test->pdev, edma->bar_base); + edma->bar_base =3D NULL; + } +} + +static void pci_endpoint_test_remote_edma_teardown(struct pci_endpoint_tes= t *test) +{ + struct pci_endpoint_test_edma *edma =3D test->data; + + pci_endpoint_test_dw_edma_cleanup(test, edma); + kfree(edma); + test->data =3D NULL; +} + +/* + * Reserve exactly one IRQ vector for dw-edma by freeing the last handler. + * This avoids changing existing MSI/MSI-X tests unless remote eDMA is use= d. + */ +static int pci_endpoint_test_edma_reserve_irq(struct pci_endpoint_test *te= st) +{ + struct pci_dev *pdev =3D test->pdev; + + if (test->irq_type !=3D PCITEST_IRQ_TYPE_MSI && + test->irq_type !=3D PCITEST_IRQ_TYPE_MSIX) + return -EOPNOTSUPP; + + if (test->num_irqs < 2) + return -ENOSPC; + + /* use the last vector for remote eDMA use */ + free_irq(pci_irq_vector(pdev, test->num_irqs - 1), test); + return test->num_irqs - 1; +} + +static void pci_endpoint_test_edma_restore_irq(struct pci_endpoint_test *t= est) +{ + struct pci_dev *pdev =3D test->pdev; + int ret; + + ret =3D request_irq(pci_irq_vector(pdev, test->num_irqs - 1), + pci_endpoint_test_irqhandler, IRQF_SHARED, test->name, + test); + if (ret) + dev_warn(&pdev->dev, + "failed to restore IRQ vector %d after remote eDMA: %d\n", + test->num_irqs - 1, ret); +} + +static const struct dw_edma_plat_ops test_edma_ops =3D { + .irq_vector =3D pci_endpoint_test_edma_irq_vector, +}; + +static int pci_endpoint_test_dw_edma_setup(struct pci_endpoint_test *test) +{ + struct pci_endpoint_test_edma *edma =3D test->data; + struct pci_endpoint_test_edma_filter f; + struct pci_endpoint_test_edma *new; + struct pci_dev *pdev =3D test->pdev; + struct device *dev =3D &pdev->dev; + struct pcitest_edma_info info; + resource_size_t bar_size; + u32 ll_rd_off, ll_rd_size; + u32 ll_wr_off, ll_wr_size; + u32 reg_off, reg_size; + dma_cap_mask_t mask; + enum pci_barno bar; + int ret; + + if (edma && edma->probed) + return 0; + + new =3D kzalloc_obj(*new, GFP_KERNEL); + if (!new) + return -ENOMEM; + + ret =3D pci_endpoint_test_edma_reserve_irq(test); + if (ret < 0) + goto err_free; + new->irq =3D ret; + + bar =3D pci_endpoint_test_edma_bar(pdev); + if (bar =3D=3D NO_BAR) { + ret =3D -EOPNOTSUPP; + goto err_restore_irq; + } + + new->bar_base =3D pci_iomap(pdev, bar, 0); + if (!new->bar_base) { + ret =3D -ENOMEM; + goto err_restore_irq; + } + bar_size =3D pci_resource_len(pdev, bar); + + /* Snapshot the info (avoid repeated __iomem reads). */ + memcpy_fromio(&info, new->bar_base, sizeof(info)); + if (le32_to_cpu(info.magic) !=3D PCITEST_EDMA_INFO_MAGIC || + le32_to_cpu(info.version) !=3D PCITEST_EDMA_INFO_VERSION) { + dev_err(&pdev->dev, "Invalid eDMA info\n"); + ret =3D -EINVAL; + goto err_cleanup; + } + + reg_off =3D le32_to_cpu(info.reg_off); + reg_size =3D le32_to_cpu(info.reg_size); + ll_rd_off =3D le32_to_cpu(info.ll_rd_off); + ll_rd_size =3D le32_to_cpu(info.ll_rd_size); + ll_wr_off =3D le32_to_cpu(info.ll_wr_off); + ll_wr_size =3D le32_to_cpu(info.ll_wr_size); + + if (reg_off > bar_size || reg_size > bar_size - reg_off || + ll_rd_off > bar_size || ll_rd_size > bar_size - ll_rd_off || + ll_wr_off > bar_size || ll_wr_size > bar_size - ll_wr_off) { + dev_err(&pdev->dev, "eDMA info offsets out of BAR range\n"); + ret =3D -EINVAL; + goto err_cleanup; + } + + memset(&new->chip, 0, sizeof(new->chip)); + new->chip.dev =3D &pdev->dev; + new->chip.mf =3D EDMA_MF_EDMA_UNROLL; + new->chip.nr_irqs =3D 1; + new->chip.ops =3D &test_edma_ops; + new->chip.reg_base =3D new->bar_base + reg_off; + new->chip.ll_rd_cnt =3D 1; + new->chip.ll_region_rd[0].paddr =3D le64_to_cpu(info.ll_rd_phys); + new->chip.ll_region_rd[0].vaddr.io =3D new->bar_base + ll_rd_off; + new->chip.ll_region_rd[0].sz =3D ll_rd_size; + new->chip.ll_wr_cnt =3D 1; + new->chip.ll_region_wr[0].paddr =3D le64_to_cpu(info.ll_wr_phys); + new->chip.ll_region_wr[0].vaddr.io =3D new->bar_base + ll_wr_off; + new->chip.ll_region_wr[0].sz =3D ll_wr_size; + + test->data =3D new; + ret =3D dw_edma_probe(&new->chip); + if (ret) { + dev_err(&pdev->dev, "Failed to probe eDMA: %d\n", ret); + goto err_cleanup; + } + new->probed =3D true; + + /* Request one channel per direction. */ + dma_cap_zero(mask); + dma_cap_set(DMA_SLAVE, mask); + f.dma_dev =3D dev; + f.direction =3D BIT(DMA_MEM_TO_DEV); + new->m2d =3D dma_request_channel(mask, test_edma_filter_fn, &f); + f.direction =3D BIT(DMA_DEV_TO_MEM); + new->d2m =3D dma_request_channel(mask, test_edma_filter_fn, &f); + if (!new->m2d || !new->d2m) { + ret =3D -ENODEV; + goto err_cleanup; + } + + /* + * Best-effort attempt, ie. even if it fails for some reason, the + * endpoint will ignore endpoint-local interrupts (edma_int bus). + */ + dw_edma_chan_irq_config(new->m2d, DW_EDMA_CH_IRQ_REMOTE); + dw_edma_chan_irq_config(new->d2m, DW_EDMA_CH_IRQ_REMOTE); + + return 0; +err_cleanup: + pci_endpoint_test_dw_edma_cleanup(test, new); +err_restore_irq: + pci_endpoint_test_edma_restore_irq(test); +err_free: + kfree(new); + test->data =3D NULL; + return ret; +} + +static int pci_endpoint_test_remote_edma_setup(struct pci_endpoint_test *t= est, + size_t size) +{ + struct pci_dev *pdev =3D test->pdev; + struct device *dev =3D &pdev->dev; + unsigned long left; + u32 status; + + /* Same rule as existing tests: IRQ type must be configured first */ + if (test->irq_type !=3D PCITEST_IRQ_TYPE_MSI && + test->irq_type !=3D PCITEST_IRQ_TYPE_MSIX) { + dev_err(dev, "Invalid IRQ type for remote eDMA\n"); + return -EINVAL; + } + + /* Need one spare vector for dw-edma */ + if (test->num_irqs < 2) + return -ENOSPC; + + /* + * Ensure EP command handler won't reject us due to stale flags. + * (remote-eDMA setup itself is not "FLAG_USE_DMA") + */ + pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_FLAGS, 0); + pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_TYPE, + test->irq_type); + pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_IRQ_NUMBER, 1); + + reinit_completion(&test->irq_raised); + test->last_irq =3D -ENODATA; + + pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size); + pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, + COMMAND_REMOTE_EDMA_SETUP); + + left =3D wait_for_completion_timeout(&test->irq_raised, + msecs_to_jiffies(1000)); + if (!left) + return -ETIMEDOUT; + + status =3D pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS); + if (status & STATUS_REMOTE_EDMA_SETUP_FAIL) { + dev_err(dev, "Endpoint failed to setup remote eDMA window\n"); + return -EIO; + } + if (!(status & STATUS_REMOTE_EDMA_SETUP_SUCCESS)) { + dev_err(dev, + "Endpoint did not report remote eDMA setup success\n"); + return -EIO; + } + + return pci_endpoint_test_dw_edma_setup(test); +} + +static int pci_endpoint_test_edma_xfer(struct pci_dev *pdev, + struct pci_endpoint_test_edma *edma, + void *buf, size_t len, + dma_addr_t dev_addr, + enum dma_transfer_direction dir) +{ + struct dma_async_tx_descriptor *tx; + enum dma_data_direction map_dir; + struct device *dev =3D &pdev->dev; + struct dma_slave_config cfg; + struct completion done; + struct dma_chan *chan; + struct scatterlist sg; + dma_cookie_t cookie; + int ret; + + memset(&cfg, 0, sizeof(cfg)); + if (dir =3D=3D DMA_MEM_TO_DEV) { + chan =3D edma->m2d; + map_dir =3D DMA_TO_DEVICE; + cfg.direction =3D DMA_MEM_TO_DEV; + cfg.dst_addr =3D dev_addr; + } else if (dir =3D=3D DMA_DEV_TO_MEM) { + chan =3D edma->d2m; + map_dir =3D DMA_FROM_DEVICE; + cfg.direction =3D DMA_DEV_TO_MEM; + cfg.src_addr =3D dev_addr; + } else { + return -EINVAL; + } + + ret =3D dmaengine_slave_config(chan, &cfg); + if (ret) + return ret; + + sg_init_one(&sg, buf, len); + if (!dma_map_sg(dev, &sg, 1, map_dir)) { + dev_err(dev, "unable to map local address\n"); + return -EIO; + } + + tx =3D dmaengine_prep_slave_sg(chan, &sg, 1, dir, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + if (!tx) { + dev_err(dev, "failed to prepare slave for sg\n"); + ret =3D -EIO; + goto unmap; + } + + init_completion(&done); + tx->callback =3D (dma_async_tx_callback)complete; + tx->callback_param =3D &done; + + cookie =3D dmaengine_submit(tx); + ret =3D dma_submit_error(cookie); + if (ret) { + dev_err(dev, "remote eDMA submission error: %d\n", ret); + goto unmap; + } + + dma_async_issue_pending(chan); + + if (!wait_for_completion_timeout(&done, msecs_to_jiffies(5000))) { + dev_err(dev, "remote eDMA transfer timeout\n"); + dmaengine_terminate_sync(chan); + ret =3D -ETIMEDOUT; + goto unmap; + } + + ret =3D 0; +unmap: + dma_unmap_sg(dev, &sg, 1, map_dir); + return ret; +} + +static int pci_endpoint_test_edma_write(struct pci_endpoint_test *test, + size_t size) +{ + struct pci_endpoint_test_edma *edma; + struct pci_dev *pdev =3D test->pdev; + struct device *dev =3D &pdev->dev; + struct pcitest_edma_info info; + u32 reg, crc32, peer_crc32; + unsigned long left; + int ret; + + /* + * Note that test->alignment does not apply here. If some vendor + * dmaengine for remote use may impose some alignment restriction, we + * may as well introduce another field such as + * test->remote_dma_alignment. + */ + void *orig_addr __free(kfree) =3D kzalloc(size, GFP_KERNEL); + if (!orig_addr) + return -ENOMEM; + + ret =3D pci_endpoint_test_remote_edma_setup(test, size); + if (ret) + return ret; + + edma =3D test->data; + if (!edma) { + ret =3D -ENODEV; + goto err; + } + + get_random_bytes(orig_addr, size); + + pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_STATUS, 0); + + memcpy_fromio(&info, edma->bar_base, sizeof(info)); + if (le32_to_cpu(info.test_buf_size) < size) { + ret =3D -EINVAL; + goto err; + } + + ret =3D pci_endpoint_test_edma_xfer(test->pdev, edma, orig_addr, size, + le64_to_cpu(info.test_buf_phys), + DMA_MEM_TO_DEV); + if (ret) { + dev_err(dev, "pci_endpoint_test_edma_xfer error: %d\n", ret); + goto err; + } + + reinit_completion(&test->irq_raised); + + pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_STATUS, 0); + pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_SIZE, size); + pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_COMMAND, + COMMAND_REMOTE_EDMA_CHECKSUM); + + left =3D wait_for_completion_timeout(&test->irq_raised, + msecs_to_jiffies(1000)); + + reg =3D pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_STATUS); + + if (!left || !(reg & STATUS_REMOTE_EDMA_CHECKSUM_SUCCESS)) { + dev_err(dev, "Failed to get checksum\n"); + ret =3D -EINVAL; + goto err; + } + + crc32 =3D crc32_le(~0, orig_addr, size); + peer_crc32 =3D pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM); + if (crc32 !=3D peer_crc32) { + dev_err(dev, + "Checksum mismatch: %#x vs %#x\n", crc32, peer_crc32); + ret =3D -EINVAL; + } +err: + pci_endpoint_test_remote_edma_teardown(test); + pci_endpoint_test_edma_restore_irq(test); + return ret; +} + +static int pci_endpoint_test_edma_read(struct pci_endpoint_test *test, + size_t size) +{ + struct pci_endpoint_test_edma *edma; + struct pci_dev *pdev =3D test->pdev; + struct device *dev =3D &pdev->dev; + struct pcitest_edma_info info; + u32 crc32, peer_crc32; + int ret; + + /* + * Note that test->alignment does not apply here. If some vendor + * dmaengine for remote use may impose some alignment restriction, we + * may as well introduce another field such as + * test->remote_dma_alignment. + */ + void *orig_addr __free(kfree) =3D kzalloc(size, GFP_KERNEL); + if (!orig_addr) + return -ENOMEM; + + ret =3D pci_endpoint_test_remote_edma_setup(test, size); + if (ret) + return ret; + + peer_crc32 =3D pci_endpoint_test_readl(test, PCI_ENDPOINT_TEST_CHECKSUM); + + edma =3D test->data; + if (!edma) { + ret =3D -ENODEV; + goto err; + } + + pci_endpoint_test_writel(test, PCI_ENDPOINT_TEST_STATUS, 0); + + memcpy_fromio(&info, edma->bar_base, sizeof(info)); + if (le32_to_cpu(info.test_buf_size) < size) { + ret =3D -EINVAL; + goto err; + } + + ret =3D pci_endpoint_test_edma_xfer(test->pdev, edma, orig_addr, size, + le64_to_cpu(info.test_buf_phys), + DMA_DEV_TO_MEM); + if (ret) { + dev_err(dev, "pci_endpoint_test_edma_xfer error: %d\n", ret); + goto err; + } + + crc32 =3D crc32_le(~0, orig_addr, size); + if (crc32 !=3D peer_crc32) { + dev_err(dev, + "Checksum mismatch: %#x vs %#x\n", crc32, peer_crc32); + ret =3D -EINVAL; + } +err: + pci_endpoint_test_remote_edma_teardown(test); + pci_endpoint_test_edma_restore_irq(test); + return ret; +} +#else +static bool pci_endpoint_test_bar_is_reserved(struct pci_endpoint_test *te= st, + enum pci_barno barno) +{ + return 0; +} + +static void pci_endpoint_test_remote_edma_teardown(struct pci_endpoint_tes= t *test) +{ +} + +static int pci_endpoint_test_edma_write(struct pci_endpoint_test *test, + size_t size) +{ + return -EOPNOTSUPP; +} + +static int pci_endpoint_test_edma_read(struct pci_endpoint_test *test, + size_t size) +{ + return -EOPNOTSUPP; +} +#endif + static irqreturn_t pci_endpoint_test_irqhandler(int irq, void *dev_id) { struct pci_endpoint_test *test =3D dev_id; @@ -307,6 +924,9 @@ static int pci_endpoint_test_bar(struct pci_endpoint_te= st *test, if (barno =3D=3D test->test_reg_bar) bar_size =3D 0x4; =20 + if (pci_endpoint_test_bar_is_reserved(test, barno)) + return -EOPNOTSUPP; + /* * Allocate a buffer of max size 1MB, and reuse that buffer while * iterating over the whole BAR size (which might be much larger). @@ -354,6 +974,9 @@ static void pci_endpoint_test_bars_write_bar(struct pci= _endpoint_test *test, if (barno =3D=3D test->test_reg_bar) size =3D 0x4; =20 + if (pci_endpoint_test_bar_is_reserved(test, barno)) + return; + for (j =3D 0; j < size; j +=3D 4) writel_relaxed(bar_test_pattern_with_offset(barno, j), test->bar[barno] + j); @@ -372,6 +995,9 @@ static int pci_endpoint_test_bars_read_bar(struct pci_e= ndpoint_test *test, if (barno =3D=3D test->test_reg_bar) size =3D 0x4; =20 + if (pci_endpoint_test_bar_is_reserved(test, barno)) + return 0; + for (j =3D 0; j < size; j +=3D 4) { u32 expected =3D bar_test_pattern_with_offset(barno, j); =20 @@ -645,6 +1271,9 @@ static int pci_endpoint_test_write(struct pci_endpoint= _test *test, =20 size =3D param.size; =20 + if (param.flags & PCITEST_FLAGS_USE_REMOTE_EDMA) + return pci_endpoint_test_edma_write(test, size); + use_dma =3D !!(param.flags & PCITEST_FLAGS_USE_DMA); if (use_dma) flags |=3D FLAG_USE_DMA; @@ -742,6 +1371,9 @@ static int pci_endpoint_test_read(struct pci_endpoint_= test *test, =20 size =3D param.size; =20 + if (param.flags & PCITEST_FLAGS_USE_REMOTE_EDMA) + return pci_endpoint_test_edma_read(test, size); + use_dma =3D !!(param.flags & PCITEST_FLAGS_USE_DMA); if (use_dma) flags |=3D FLAG_USE_DMA; @@ -1139,6 +1771,7 @@ static void pci_endpoint_test_remove(struct pci_dev *= pdev) if (id < 0) return; =20 + pci_endpoint_test_remote_edma_teardown(test); pci_endpoint_test_release_irq(test); pci_endpoint_test_free_irq_vectors(test); =20 diff --git a/include/uapi/linux/pcitest.h b/include/uapi/linux/pcitest.h index d6023a45a9d0..c72d999cecf7 100644 --- a/include/uapi/linux/pcitest.h +++ b/include/uapi/linux/pcitest.h @@ -30,7 +30,8 @@ #define PCITEST_IRQ_TYPE_MSIX 2 #define PCITEST_IRQ_TYPE_AUTO 3 =20 -#define PCITEST_FLAGS_USE_DMA 0x00000001 +#define PCITEST_FLAGS_USE_DMA 0x00000001 +#define PCITEST_FLAGS_USE_REMOTE_EDMA 0x00000002 =20 struct pci_endpoint_test_xfer_param { unsigned long size; --=20 2.51.0 From nobody Sun Feb 8 22:43:08 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020105.outbound.protection.outlook.com [52.101.229.105]) (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 281B13587AE; Sun, 18 Jan 2026 13:56:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.105 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744564; cv=fail; b=IAAMD40L8cpp9WY3dLsHW7kIH1YMjPwYl6MtEUKxTvGqr8gQ7E/M8ZGVeMs3MhHpNVzDrRn/Ji5dO2MrrhZi5a99auO6cG69vzoHcPjzlPUBGtYoeDjpjqtQVvBLuo+nefSoCRAiYNvv3fob0d3/tR70FCtL35EdJ0DgSIG+XuM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768744564; c=relaxed/simple; bh=OFUkD4E+4Ukvxd4hwqTv1/sNXaCaoiCDWemyU+y7EwI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=HO4LnJFKPbMAC/KYcR/hNqW0qDx4NvmQdTpgLxelrzc/mdBup59SoqzWyWFnHNxdzLoaxyHGaQpiKBZmDe/lxCGpnd6G+R+lT+nwGByBqS0Hq9YgnwKvz/m1EscNGBZnoAlVajPZZWRScnkA6EBR7lmynCK3EL1QZQao73QOKYg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp; spf=pass smtp.mailfrom=valinux.co.jp; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b=jYlG2kU8; arc=fail smtp.client-ip=52.101.229.105 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=valinux.co.jp Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp header.b="jYlG2kU8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=R+Fza3Jgk3Zbjn6eMQpYzSSg9AkJS4KDLcPqJxLujCCyMWY/vpVemGOLexVe4N53Zvo5YSKna1OtAnUtlBSR4OW1+jfvBdDjCydIMynYZ8fC8vQzqYD8TtKGW7DZIYF9qvofZMoOJdFJmD4FusNJN8///RrKSjNIuQBGU9eB+O4mZXwxHpTzCEsB5UOjZFILy3jOTveGjcpY+UPsIDTD54arEI9OL+W7FpcM7T1UDGQnVhNXYVKTU0Sh1LJMMXdtmWiyMOUi1JfSZZCOHBf7cxY6vE3Dc2jpdElVt5THgQI0yXMHJ2W/3AW0BqCsK/DSlw2aPaNSh6wVP0xJb4irfQ== 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=2IV6mAImmdaQxF+HLb3oX6pkRkUuKqxuOTBnEtlk+FM=; b=ypQq0OSwKPd3ZB681Ag41xx55tApYREH5F3DbFVLJhout5zgJgL8hd9yEmmKEL60LrPzP0Wn1+AX07oZa0qCWi1LS31megbf3BgExb4rOhGq7Brh5gIkFGCkPrW2m0aqzGaNm86Mv+walZsAPpEAG9iDMvzhq+EWq7EwEBG769J6FNa1ih0Ph6KD01u04LUWmzT4JYCK3U9t9uDiRkmjiSFsK4sMJOnrVhCdcVS4mRNljv4mgBomRs8h11sG8zs9pC7JeQ9pTc40tL0OSRYl2aiCQ2QpLo32REA9CzM3xVXwxqUCKmarRCwTPPmErElQY+QsuSVwCzzOktVFVZomsA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=valinux.co.jp; dmarc=pass action=none header.from=valinux.co.jp; dkim=pass header.d=valinux.co.jp; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=valinux.co.jp; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=2IV6mAImmdaQxF+HLb3oX6pkRkUuKqxuOTBnEtlk+FM=; b=jYlG2kU8SOpbhqlyI4wHu1V+ZTthZnLlqWehhP5yOhvWnJKu+aW7u8sIzs19ZHIrN/xUHkKq6nt5DH18iSjHAV1SfhG34SbaSPG4JavDvPxPXaoR29LcLuGTiWbXSJbx1QSadTtOmFkmskMX4hdhV8GuCoH5anDQK/RCXiscssY= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=valinux.co.jp; Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) by OSZP286MB2093.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:180::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9520.10; Sun, 18 Jan 2026 13:55:48 +0000 Received: from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9520.009; Sun, 18 Jan 2026 13:55:48 +0000 From: Koichiro Den To: Frank.Li@nxp.com, dave.jiang@intel.com, cassel@kernel.org, mani@kernel.org, kwilczynski@kernel.org, kishon@kernel.org, bhelgaas@google.com, geert+renesas@glider.be, robh@kernel.org, vkoul@kernel.org, jdmason@kudzu.us, allenbh@gmail.com, jingoohan1@gmail.com, lpieralisi@kernel.org Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, dmaengine@vger.kernel.org, iommu@lists.linux.dev, ntb@lists.linux.dev, netdev@vger.kernel.org, linux-kselftest@vger.kernel.org, arnd@arndb.de, gregkh@linuxfoundation.org, joro@8bytes.org, will@kernel.org, robin.murphy@arm.com, magnus.damm@gmail.com, krzk+dt@kernel.org, conor+dt@kernel.org, corbet@lwn.net, skhan@linuxfoundation.org, andriy.shevchenko@linux.intel.com, jbrunet@baylibre.com, utkarsh02t@gmail.com Subject: [RFC PATCH v4 38/38] selftests: pci_endpoint: Add remote eDMA transfer coverage Date: Sun, 18 Jan 2026 22:54:40 +0900 Message-ID: <20260118135440.1958279-39-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260118135440.1958279-1-den@valinux.co.jp> References: <20260118135440.1958279-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TY4P286CA0066.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:371::10) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10) 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: TY7P286MB7722:EE_|OSZP286MB2093:EE_ X-MS-Office365-Filtering-Correlation-Id: 093b9545-ef78-4b46-5f05-08de569939b2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|10070799003|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?qKHl/G6XrMVx8HQdRGmdRtj1cafNBKh6lGgli5JGvBJLomO9WhGHQE7Dw7GZ?= =?us-ascii?Q?2Sss5Dge94QrXweqHb0aDuOPNBgmwkhq8r048vWev3rIHzXzHwqqh8RQwvJ/?= =?us-ascii?Q?l2RfIsWpBEHPMsPjkcZ76oXcje/JWXMZSxeMymMspbZypZi+WQG7BTzhjSjl?= =?us-ascii?Q?xqJq4Fop2JfCqT4S00BLohlyZJFfThuK0YOIsOyRCZmiptQYasaRI6IsSk06?= =?us-ascii?Q?bbQs3etXp7E4TqfCvErTKJSgyB0hd6bE+A39NqMlZRzq4S63dnQtR6KUUWxg?= =?us-ascii?Q?zl4BG9HT+A9mqUxCtklcuUAbXWXDiixzzcTreHYxLaccatpilre7DOfenB8N?= =?us-ascii?Q?y1U/HliJw6i9YkWk5hjmhXBBIAy6CoqNXmzRL1mtDqI3snRQapBr4nTYtNpX?= =?us-ascii?Q?r3mx4atBzL1Vlqzf12JqMJux6OvUnwdYO8Fi8xvJDHFMLK5eqEtXVzq70XZd?= =?us-ascii?Q?Ki9yWYJXFLw28m/bmW29qAQAjzxyq3ib01Ja0eNW4AqUY7rFU5r82uzqkxP3?= =?us-ascii?Q?9OEckoIGrkYi5OBx0U5JJuyR1hYtZT1UpZ5Ftd2+UD7u5j/R1JEUqZvUoHxl?= =?us-ascii?Q?OWkdwj1UJfV349GXj5JQQKc+t9e/PSSknCW0a6ppSOQWe/kDigQO+GK0qa6k?= =?us-ascii?Q?cyNtNOBoulAqJv96cgJScanXHAjkxvjXQyP9A/8x5IZcXmtmXzUTk6aW9vGh?= =?us-ascii?Q?eJtnvjhlGAZ/9U1ZyYceLP+S48EPMIyU9kwUQUjAgUjKsSU6i1MYx1aTr/Wd?= =?us-ascii?Q?RHPdaU1CFhTp5dnyvOI3CbG53y0SDQMtt2u9DlxYg7UokZcM+tq1EZtOQiCA?= =?us-ascii?Q?ZApZB4hT/Gfi1TjaNl+pgGefFvCZfuzmndYW5Spfw96ck77muDgVI1BgM1id?= =?us-ascii?Q?9qiCho9oIUbPzEg+0kOqqR0mYaTM4UF6mkWXkgYkOFSWV4QZVy6PRJwQ+MWj?= =?us-ascii?Q?pfNJN9JW6UNjk1lwGW+28K6e1gzqOh2DC35uI8IJ3QCy8rHLZ8i6MsUIzvwt?= =?us-ascii?Q?FxiH6iIs61eCU6dKgf4DJbWPx/PyU1s2PKSIrbwNV9IIwBOfwtvhpGNF/dv9?= =?us-ascii?Q?mIUECwTXhaaBZxg50u2WiGRFTfOjGbHEdI2WL6KFCGktOBQ5NGh3qS+J7W6Q?= =?us-ascii?Q?CezrJjKu8n/LCGMEp/WLQB2rlmW2X1zBAA5XjShKHJpVx0bAejjZRXslDRhI?= =?us-ascii?Q?Cl6lcXAUI1gx96tVRPDNTTKSlpTL0jzCxiV1OheqMM/nP9dpTDokLmQxD507?= =?us-ascii?Q?tF3GNcD1f17PWVvyFixdNIbhElIlIBcZ4wYooYMElbc0jlQ9O41kqqyPOV8E?= =?us-ascii?Q?Q2+qMQOB71L6UAkHmbx5S5iWMk9AxqBw7gkix+5ltyToHxZ4n8nABjk9GiS3?= =?us-ascii?Q?JVlmCaZKfYqj6WQ0SRJAIl2x5lu15jioTKgGQeTr5GLhVOJkBP1PBzARHbnt?= =?us-ascii?Q?5k/jJ/Sr+yZ0fmdYPIpWbM/FrXE9kxmbqRir+Pks10cEcW+szSg3vqwoiO7M?= =?us-ascii?Q?6dKu8Z42pF3cdujS2hRUSA+LxQjmW8zEgusdKYcZh9YnTTSEhaEocM3rSNkl?= =?us-ascii?Q?ZWehaNw+/O1+ie7yDQpzZrnYEB723ZHGs++tptXVgTU0J/wiYQVfxpFmkwSO?= =?us-ascii?Q?NQ=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM;PTR:;CAT:NONE;SFS:(13230040)(366016)(376014)(7416014)(10070799003)(1800799024)(921020);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?vUx5OEvjRGYKYdRUS+EAxmZCYwG9WmODx/NcW55oy5U9SnCrA0AMkSE4o2Di?= =?us-ascii?Q?9ZNqe2S8t7S3jC2GbYvtHJaBYSlHxaxGIhS22ASEGjL9SyBcl4QQuNDRy5Bo?= =?us-ascii?Q?9a66BKu7vx8Lc2XfZ2+MuKsxw9F1MLB6mcUKxhJ/9QaczN2COa30JoJWEsb/?= =?us-ascii?Q?Cdn9Jv9XbxVL8YyxbG9uPMrwfflbBHgLx9HR6nSLDZZB3+ky3WC3KlWorO5k?= =?us-ascii?Q?/80RLdlfj1OJsV0MSymIeBNTY/0/Ewa3ccxi4PJ5xJUjWMvMDn45EKZTmS0i?= =?us-ascii?Q?A4p1GTg0DZEUF9RtI5AYRDoga+gv98VVV15lU+VI0OukBdB80xYV2bqzZuaz?= =?us-ascii?Q?CB8Spo/D97cfQtplnDS1V8PoGomLDhwrS6mxKXOF6UI29tjMZcEKEehGgPby?= =?us-ascii?Q?5FQQ3+w5S4/6qOj2RqQ0qW44IKMOCJo9K/ce5t4WgasKS0mYD2LoUAK5IrhC?= =?us-ascii?Q?O6Nuh/gJ3/lIV15yIup65yQM50QfKD4jLLAcmkhOQeXEG235rlcYg8pVzEU9?= =?us-ascii?Q?wBEe4EMdlK73KkW2dYwSeuK3XvWDDaeKa9qP9lRqNlioMT7j9ddyxq5RGkmV?= =?us-ascii?Q?BvstqzgJMaMgisqqSsFDXwttMMXJKtEo72iUwMSyTr9EINA3NfgmKE9hzPXr?= =?us-ascii?Q?Y6kchCiSb1AzZ2w0a5Aosl0p2FE8LLv6TrTUm/IzEg+AmkV1++ohJYubkM1Q?= =?us-ascii?Q?T46NdF2y0yTkbgI/hOYXXmmCs2bxExu2RO17e5IFzDSZbp4jMRbypjWsJyXh?= =?us-ascii?Q?lxPhZglKmJSBCOuVllQGkYR4EUl0oiNk+vcF9qhUXSs3ff+0IohFQ37eyOxI?= =?us-ascii?Q?S8oPh8RPzzoG5F0/DJ2B4cFxYb4J4Jq64/I4OWShk+Kp26LtxFnO72q8fnb6?= =?us-ascii?Q?1HYJ3LTr69UHoQqaZIK7MT7x5gzQWqOQCoSTEeIxIpoX+hpvDnOsfL40Vx9+?= =?us-ascii?Q?1uI8+GMJtoPwDEhmMyusZjN0SErssNIcwPiplIUWEcR7vtpttUs065ue3kQr?= =?us-ascii?Q?fV4sCpoYV0XpUbe9du5S0NDpb/U/WXIgkq6iklr/3sg787WvpqH6apYqYxm3?= =?us-ascii?Q?n/Q3EekPpE8ZKAEN+48Hj++4uBG5PbHaaDIqMdHptzsgVXc1iX4yXNNcLFmx?= =?us-ascii?Q?shrTNlaCnSJADAhqSwYVM5C6QRy+euxyMgVVqe3ToX2JWB9eBL+omd0/z+I/?= =?us-ascii?Q?HWeWCUpSFCLWrgByqVLLwg/GKTH0/MrLihdBj46K+zbNr6APGnRv/Lpq/j2v?= =?us-ascii?Q?023qHZUgoQIvJwUaeF59LzKQttnIK5Ukn9E3yJasmKWc32+02ROyX2MuZwlh?= =?us-ascii?Q?/gMmCUf45nb4gl/RciG8HKL8w6HPfaPDaP/awFHZVPVcEyazqBAESImeno2m?= =?us-ascii?Q?GBLZxkmMPsVIq90Nb6rhRYhfbJhcMgcXQ55seqFYyQy0U+E9/kP3sH+UeVPo?= =?us-ascii?Q?SL/yjH/nehf4BEv6nyAKnZPcoFtFkeF8vduA1Ddcm+aY0H8BZlwIW9VPkMpa?= =?us-ascii?Q?jD/aYQgv6v/KNb4u30WSi0V1cqUFDasS56R1gG9JJFUbxVUB+s8ylskhac3s?= =?us-ascii?Q?tk3ZxbcyQYtsKai9NL0BL/eJErXrGb+gzwbgjUivR7k9rJRw7B+xg6AU3IgD?= =?us-ascii?Q?s53nv7xhH+4O3PFQUzTBXqIGs3EZ3uJX7/IDUCZqebnekJS/m4HUZRmaADK8?= =?us-ascii?Q?g7A1GPBZDe2usrHVdIvtz0vZmqct8beDPMH3j1jnjaCAODgN+kHeHy6IUhTg?= =?us-ascii?Q?GtGO5J5KH3384ErFm3ZkIpezuRQkxNQaZ52u5iwEOgpFOUX3SqYq?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: 093b9545-ef78-4b46-5f05-08de569939b2 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2026 13:55:23.1538 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 7a57bee8-f73d-4c5f-a4f7-d72c91c8c111 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: EPzcYAk0saVCN5s+E9WpisbOpmIzm0iV+mVuk40e2a2ieo127oPFM7lIygEVb5S3qidv4ZS0CAtfN3EJeBZsmQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: OSZP286MB2093 Content-Type: text/plain; charset="utf-8" Extend the pci_endpoint_test kselftest with a 'remote_edma' variant for READ/WRITE tests. The variant sets PCITEST_FLAGS_USE_REMOTE_EDMA and skips the test when the feature is not supported. Also treat -EOPNOTSUPP from BAR tests as "BAR is reserved" and skip, since the host driver may reserve a BAR for remote-eDMA metadata. Signed-off-by: Koichiro Den --- .../selftests/pci_endpoint/pci_endpoint_test.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c b/too= ls/testing/selftests/pci_endpoint/pci_endpoint_test.c index 23aac6f97061..39593da3b40d 100644 --- a/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c +++ b/tools/testing/selftests/pci_endpoint/pci_endpoint_test.c @@ -67,6 +67,8 @@ TEST_F(pci_ep_bar, BAR_TEST) pci_ep_ioctl(PCITEST_BAR, variant->barno); if (ret =3D=3D -ENODATA) SKIP(return, "BAR is disabled"); + if (ret =3D=3D -EOPNOTSUPP) + SKIP(return, "BAR is reserved"); EXPECT_FALSE(ret) TH_LOG("Test failed for BAR%d", variant->barno); } =20 @@ -165,16 +167,25 @@ FIXTURE_TEARDOWN(pci_ep_data_transfer) FIXTURE_VARIANT(pci_ep_data_transfer) { bool use_dma; + bool use_remote_edma; }; =20 FIXTURE_VARIANT_ADD(pci_ep_data_transfer, memcpy) { .use_dma =3D false, + .use_remote_edma =3D false, }; =20 FIXTURE_VARIANT_ADD(pci_ep_data_transfer, dma) { .use_dma =3D true, + .use_remote_edma =3D false, +}; + +FIXTURE_VARIANT_ADD(pci_ep_data_transfer, remote_edma) +{ + .use_dma =3D false, + .use_remote_edma =3D true, }; =20 TEST_F(pci_ep_data_transfer, READ_TEST) @@ -184,6 +195,8 @@ TEST_F(pci_ep_data_transfer, READ_TEST) =20 if (variant->use_dma) param.flags =3D PCITEST_FLAGS_USE_DMA; + if (variant->use_remote_edma) + param.flags =3D PCITEST_FLAGS_USE_REMOTE_EDMA; =20 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_AUTO); ASSERT_EQ(0, ret) TH_LOG("Can't set AUTO IRQ type"); @@ -203,6 +216,8 @@ TEST_F(pci_ep_data_transfer, WRITE_TEST) =20 if (variant->use_dma) param.flags =3D PCITEST_FLAGS_USE_DMA; + if (variant->use_remote_edma) + param.flags =3D PCITEST_FLAGS_USE_REMOTE_EDMA; =20 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_AUTO); ASSERT_EQ(0, ret) TH_LOG("Can't set AUTO IRQ type"); @@ -222,6 +237,8 @@ TEST_F(pci_ep_data_transfer, COPY_TEST) =20 if (variant->use_dma) param.flags =3D PCITEST_FLAGS_USE_DMA; + if (variant->use_remote_edma) + SKIP(return, "Remote eDMA is not supported"); =20 pci_ep_ioctl(PCITEST_SET_IRQTYPE, PCITEST_IRQ_TYPE_AUTO); ASSERT_EQ(0, ret) TH_LOG("Can't set AUTO IRQ type"); --=20 2.51.0