From nobody Tue Apr 7 16:17:48 2026 Received: from TY3P286CU002.outbound.protection.outlook.com (mail-japaneastazon11020091.outbound.protection.outlook.com [52.101.229.91]) (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 4BC523FD13F; Thu, 12 Mar 2026 16:50:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.229.91 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773334251; cv=fail; b=MxrsJw/lnIkiVtddyJFVLfWTzqz/or8O0mGvXkXPlT9yCaNEnP4/m7EtmlXHT08G5ES+uRjaFsXf7UUKNTk4mnNu86xa2iS6Dkp7XQmxKI0qfJNRO962GxZfM2iaFtNVVaZqmnCV4URLY0MXmwRNGHpdiStlMPXfJIOk4gyWK4g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773334251; c=relaxed/simple; bh=8RItrm2FU9WxewRnHNN6Y5e3vIhIssFp/dukGGv1AAY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=NSZHAuCpSUfSHq3vP/C3EU8UNAeMgKf7seHiFLAAoLEbtGvRKOQ5J5ALXdm/XMqbcLZHlwzjLIXSd1R1BSV/NXt1JLkj5wl/5DiReL/5SaaKJxWRbJHrQ8aVr4Hrk4ClKaDOSar0eZuLCnJ9ozvGUdD+7sK0LzyATNIGK+ROiGc= 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=gOUcq0B/; arc=fail smtp.client-ip=52.101.229.91 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="gOUcq0B/" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ClhP5yWn3x/xZMxiJkQ5prqZyTnHecsl/ng+ruh6rjA35y0/6xkI6q2GdD+n5bIlwwgpFp/mSb+v4ioELNyIAyLeP3wc1aHupEtraaN5HjJxQg1iyw7zxdpvpIHAYh4Wj1IuscEsBeHZSNKCX5vKHypCszyd7SdkoNl88yiNcpIfF+VKaFLUysRnDh1h7dwbZjqyGmofK+PdmdTuFvN1P3A2pMgaMDlm7aBlJ476+9nyiTZDLok40VQT90JGqaAADM7RvSKwVV1+gsyZ5w0IucDJMforKJheXyzjXLBpo4hyOikOjLQfmmcCe3X7UztIifciKcg6D3OWZeBCnwcfhw== 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=PNi1MkOWKGQnaowkzdZiofsqMmf/Q+GuHCrCK3dUivU=; b=Vws8rmZI+5OlEz24uUq9NsXDJA6LqMgRTkSHEojKLrJI08peDNBzik5162Z1wNHJzWzpHuoky1+byMHAKu+DOy6Rg0XZKP+RekaVVpkyl9r5Wt85sNEixfMmqA0O4x36MPjZe3OviHGyvWRjgJB45Ii/0PRRuZlKh4HRC0of2o8juMlXQK4kEZqXKaNHOimwvSDW3t2sBhdWWE2eg1/N3sQHiu5GrMD4JPa+lkh8B5nEJi97Z7dC1JZA0reasWTrh2D6LobL0vWqQ4kGOxi5rUyIid4rXP5bfMwD40R30muvp9GXLLrJFeU2yvQOUT+ngQkxYTiN3dMMhyDNsstddg== 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=PNi1MkOWKGQnaowkzdZiofsqMmf/Q+GuHCrCK3dUivU=; b=gOUcq0B/J8NEpZXDSzh/qjPikTi+XA4/gNm6IeRUTJgI9U+qoDhFi36yVwABoX9IL6/hKFFNaBW5gZZVtI74tJ5o1b3SO6k8XELy5rmY0vmkQx+siZ98Fbsq8I/JGa4jeMnTn/w3ks/BRlk8zlkuuXXJRkuiiBTZUgYAblEcpKI= 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 TYCP286MB2018.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:15e::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.15; Thu, 12 Mar 2026 16:50:20 +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.9700.013; Thu, 12 Mar 2026 16:50:20 +0000 From: Koichiro Den To: Manivannan Sadhasivam , =?UTF-8?q?Krzysztof=20Wilczy=C5=84ski?= , Kishon Vijay Abraham I , Bjorn Helgaas , Jonathan Corbet , Shuah Khan , Vinod Koul , Frank Li , Jon Mason , Dave Jiang , Allen Hubbe , Jingoo Han , Lorenzo Pieralisi , Rob Herring , Baruch Siach , Jerome Brunet , Niklas Cassel Cc: linux-pci@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org, ntb@lists.linux.dev Subject: [PATCH 11/15] NTB: hw: epf: Parse control-layout version and DMA locator Date: Fri, 13 Mar 2026 01:50:01 +0900 Message-ID: <20260312165005.1148676-12-den@valinux.co.jp> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260312165005.1148676-1-den@valinux.co.jp> References: <20260312165005.1148676-1-den@valinux.co.jp> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: TYCP286CA0092.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2b4::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_|TYCP286MB2018:EE_ X-MS-Office365-Filtering-Correlation-Id: e320442e-fdab-410f-d358-08de80577245 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|1800799024|10070799003|366016|7416014|921020|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: fM+AHO84IVnzdEvjdfGujk3fBUm7Ihlw24DxK66d6z1PkZKLW9wVEjxIw/1U51yEzPtYejAqI2C2pJSTvWmFm0VzFgpCkuZqRyak7ze1SSKHDBpVSHSA7DLie2IQl47Kq3siNTXPEfLi9hgPkWbBMh3oK9PVk3XLGFZUTfWhr98lq3janu+eDSsoFVMEpzhY6VcicosrgkweffQy2ooJJkUY5aaRPr9cjOvO/wxFjM4psJ6LO91F6uceYhXE6R3GZ7Xl0HGMXa4CqHZHHyuVHzSSWwnfSGLAyScNzfw3gr/3lvOnQjBBSBbQYri24OL7SPYWxrlLDEFhJuUpPbNafrS8AiRhfCLiyC6UAzGxfcfRR/VbWpIaE0CU8jiY0jwhPfre7t1I1M9MHRCAX7U8fYJuuWkMxjHgIFJO3HcNSBm2lX1IcjzcLAsX2MxCWMT0KmzTJwyKmWIxiwbCgCGcOTmbB6iTnc42/N7YfP2NZ58Gb6q2uefGqG3rG7cohgo8HvebnTvHdrkbqiC53bhkUnChr/uGUL6H39c+w3eilslfGpLlOYS+3jieOAgdP0eCXdEvmXtMxbRxKHoKKNVxkbITPMZJVzbojYkl5yK9Qhxk17Q27RPV8pCstU3t6CxRlEM4AnjQixJUlH3PMw+E7Y0TdzBzDPGPO4raqCE2JUxm/zqHAt9nf0QB99PHeVu8pHXg0mfEnioBy2JXbduUr3yxUWD+DBhhAkWxffLhbvkxoOuZ4hxUfKBnqq0tHqhkdlNAuzhFlrwyfgrEcJRJQQ== 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)(376014)(1800799024)(10070799003)(366016)(7416014)(921020)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?CVwS5+9fS8E+91cvUytpEXTtP3zjQ5leRbi9no85x9h9PxTQB6UqhH3Dq0Co?= =?us-ascii?Q?R+t8aCEhqHGgXnCerAzc5z/GHIYPq7H0G92Xqq1O4NiG519vCziVgGlb9n8f?= =?us-ascii?Q?ZQM2ppQ8ou6QYLwDVYsMv03KpleazpTNrZrNsYH9u9x1FK0JvWP/f+pzNUuD?= =?us-ascii?Q?Yx53FdyN15f62ceePOZ0RB8AnV8iMPhDWGcL3XlxXJooB/5MjMCv9DOqsIRC?= =?us-ascii?Q?9rjJ8ePhTxro3mwiIlquZCp9qjUGPJ5y1nXu/OHdR4HVBW9/Juqm6vUy+r3I?= =?us-ascii?Q?PbQgbrQaoeo7jQ9ufsYTd9LDGfMGvpwFUhYV04+clzgynkskDWVr6lnNP1OB?= =?us-ascii?Q?pmcYQ99c8yVgC0OJF7laJePEwMpgj5uybsNRMtN73usI2KKS1Nrb1/dMw4L8?= =?us-ascii?Q?/M9e352sbsg5bwxUYkm2o8jXR6/wYnB/hr4JJJjzdlcJdGtpY3MzQS3EHp/8?= =?us-ascii?Q?RATLWF9sxrarzGf17vPOGg4ZJW+oeSlwa+ref1auQjc0N5E1+1Cfx05yjOye?= =?us-ascii?Q?O5/8QWYzgF4ysW51u5GgoRQMbGKQ6jn5k37fnBASv76jljlgyP7B4n14tIZV?= =?us-ascii?Q?VeUBijA561DHswIS9MY0VWtGmgBbE30bDvy0PJ9zOBC2xmtitNkHd5TcKozb?= =?us-ascii?Q?jaNdKtInDz2JJNywr0hDUl95JPvfAV7801vIiAouk5ixd6Vn6JIyhwJfJZCO?= =?us-ascii?Q?WlL+b2gtjCwBBmiKTD7s564nT0q12SRT80FnvdxfIsW1iRiDmayaRT46njxw?= =?us-ascii?Q?B4OjQE2vjqhoUAVepmfEsmt+TXLHNoLsc08X7LZjJlKx+MgO/eQPQhL8/J4X?= =?us-ascii?Q?ORb82Xqk6+Y/z8kHUXM8fOcKE1BTHfQFyzJDr/VvL57qeWTWGxak05R5E9wz?= =?us-ascii?Q?iu10cmmYozmZinWfGaK3Hr9ltdJAIL2v7sd/RqYxXqMnMfnIfxB3bt1fSwcr?= =?us-ascii?Q?AzSX99prlp3XV8m+xy150pM7AJ8qpJ6STSDA1blHTzACgg2IRvejizBwQD+1?= =?us-ascii?Q?Mz6hgIGhiFuJMOh9KICiexWchnYmAkoPoJ99PJCow1hDghtITtluet+5nLL7?= =?us-ascii?Q?eOtT1LVKnDLIxfszx+M3nlFUDgZ/v1BVEtgNvq+bKcfv4KJuno0LfVj7DzBo?= =?us-ascii?Q?LCNhFcit8DPhNGHM6Pqs6fj0YcPa79gLy5gE1edg5bRBX2Mu53gZSX/fY/Er?= =?us-ascii?Q?MzA87iZHjACaJNYHFO1fUak8k+wrFlSy5Oli2GFA0DkoQw7UXzATqfkBZ4pK?= =?us-ascii?Q?8MmHvgR1Ah0CTGSNyQ/fWVMwn1zIR3T1GmXDGOn6MvPfnTuiZ9wqBBgWPD/F?= =?us-ascii?Q?neOBFCZr0GktAlfA2xU5vzpdEvWi0y8sveVyR4oDestv4EF2wTCAP1+Kj3+F?= =?us-ascii?Q?mAJ6vPYX15DIf1fz62hS/h5Wv1UIo6Cdn50WYAaU3G+ci8ldQd8Pel3/q58F?= =?us-ascii?Q?7UIRdjBKgt6SijYYEnq+v2zLVoo8g5rWBvZSHdS5IgVoCLv8Z3cSXyDULw7r?= =?us-ascii?Q?BpkBpiQtZLNxEo52e4BsrPsOTqPqQNjMcthgOZH65Ohm0r/Rj07q3gr4YVp/?= =?us-ascii?Q?gf86oQmV7NSgLqxuESiN3qZU9a3Zr3/0SlaJQtnhlZPjjOhFdReqeubcTLui?= =?us-ascii?Q?wSMMsxYSL6aRxilr+s9RmmFKkWwluvUtuP7FB0083oFGb61A/RKWYeqLW+Hq?= =?us-ascii?Q?Znni07xyXtWHjkUgntsM6qI1nfY0jA88qenjyFOiDCZkv3kQGmT6WNR5eiGf?= =?us-ascii?Q?AdvivQ5PVcBjIIvjUPDLsBAUsd2qZDyr9vziVZ2yiKsYMzbuM+mE?= X-OriginatorOrg: valinux.co.jp X-MS-Exchange-CrossTenant-Network-Message-Id: e320442e-fdab-410f-d358-08de80577245 X-MS-Exchange-CrossTenant-AuthSource: TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Mar 2026 16:50:20.1357 (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: cMY0ztsUzdGiZ3EP5YNsWbP+4Mv1bxNmDveHzQ3rtSCFH7PrzqHy/wYqInDNSP9clRslozsm1ffhxlD5IIDI0Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: TYCP286MB2018 Content-Type: text/plain; charset="utf-8" pci-epf-vntb can now expose either the historical control layout or a versioned extension that carries per-MW offset/size tuples and an optional DMA locator. Teach ntb_hw_epf to parse the control-layout version first, keep accepting the legacy format, and use the explicit MW size information when version 1 is present. Also parse the DMA locator and cache its BAR, offset, size, ABI, and channel count for the follow-up enumeration step. Finally, reserve the tail of the MSI/MSI-X vector allocation for the exported DMA child so ntb_hw_epf only requests the link and doorbell vectors it owns. Signed-off-by: Koichiro Den --- drivers/ntb/hw/epf/ntb_hw_epf.c | 112 +++++++++++++++++++++++++++++--- 1 file changed, 104 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 d420699ff7d6..6b427577b1bd 100644 --- a/drivers/ntb/hw/epf/ntb_hw_epf.c +++ b/drivers/ntb/hw/epf/ntb_hw_epf.c @@ -31,7 +31,14 @@ #define NTB_EPF_LINK_STATUS 0x0A #define LINK_STATUS_UP BIT(0) =20 -#define NTB_EPF_TOPOLOGY 0x0C +/* + * 0x0C was historically NTB_EPF_TOPOLOGY, but neither ntb_hw_epf nor + * pci-epf-{v,}ntb ever consumed it. Reuse it as a control-layout version + * selector while keeping 0 as the legacy format. + */ +#define NTB_EPF_CTRL_VERSION 0x0C +#define NTB_EPF_CTRL_VERSION_LEGACY 0 +#define NTB_EPF_CTRL_VERSION_V1 1 #define NTB_EPF_LOWER_ADDR 0x10 #define NTB_EPF_UPPER_ADDR 0x14 #define NTB_EPF_LOWER_SIZE 0x18 @@ -39,6 +46,13 @@ #define NTB_EPF_MW_COUNT 0x20 #define NTB_EPF_MW1_OFFSET 0x24 #define NTB_EPF_SPAD_OFFSET 0x28 +#define NTB_EPF_MW_OFFSET(n) (0x134 + (n) * 4) +#define NTB_EPF_MW_SIZE(n) (0x144 + (n) * 4) +#define NTB_EPF_DMA_ABI 0x154 +#define NTB_EPF_DMA_BAR 0x158 +#define NTB_EPF_DMA_OFFSET 0x15C +#define NTB_EPF_DMA_SIZE 0x160 +#define NTB_EPF_DMA_NUM_CHANS 0x164 #define NTB_EPF_SPAD_COUNT 0x2C #define NTB_EPF_DB_ENTRY_SIZE 0x30 #define NTB_EPF_DB_DATA(n) (0x34 + (n) * 4) @@ -101,6 +115,15 @@ struct ntb_epf_dev { unsigned int mw_count; unsigned int spad_count; unsigned int db_count; + u32 ctrl_version; + u32 dma_abi; + u32 dma_offset; + u32 dma_size; + u32 dma_num_chans; + u32 dma_irq_base; + u32 dma_irq_count; + enum pci_barno dma_bar; + bool dma_aux_avail; =20 void __iomem *ctrl_reg; void __iomem *db_reg; @@ -375,6 +398,21 @@ static int ntb_epf_init_isr(struct ntb_epf_dev *ndev, = int msi_min, int msi_max) argument &=3D ~MSIX_ENABLE; } =20 + if (irq >=3D msi_min + ndev->dma_irq_count) { + ndev->dma_aux_avail =3D true; + + /* + * Reserve the tail of the vector space for the exported DMA + * child. ntb_hw_epf only requests the prefix used for link and + * doorbell events. + */ + ndev->dma_irq_base =3D irq - ndev->dma_irq_count; + irq =3D ndev->dma_irq_base; + } else { + ndev->dma_aux_avail =3D false; + irq =3D min(NTB_EPF_MAX_DB_COUNT + 1, 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); @@ -504,21 +542,32 @@ 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, mw_size; + u32 offset; int bar; =20 - if (idx =3D=3D 0) - offset =3D readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET); - bar =3D ntb_epf_mw_to_bar(ndev, idx); if (bar < 0) return bar; =20 + bar_sz =3D pci_resource_len(ndev->ntb.pdev, bar); + + if (ndev->ctrl_version >=3D NTB_EPF_CTRL_VERSION_V1) { + offset =3D readl(ndev->ctrl_reg + NTB_EPF_MW_OFFSET(idx)); + mw_size =3D readl(ndev->ctrl_reg + NTB_EPF_MW_SIZE(idx)); + } else { + offset =3D idx =3D=3D 0 ? readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET) : 0; + mw_size =3D bar_sz - offset; + } + + if (!mw_size || offset + mw_size > bar_sz) + return -EINVAL; + 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; + *size =3D mw_size; =20 return 0; } @@ -610,14 +659,61 @@ static inline void ntb_epf_init_struct(struct ntb_epf= _dev *ndev, ndev->ntb.ops =3D &ntb_epf_ops; } =20 +static int ntb_epf_parse_ctrl_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: + ndev->ctrl_version =3D ver; + return 0; + default: + dev_err(dev, "Unsupported NTB EPF control version %u\n", ver); + return -EINVAL; + } +} + +static void ntb_epf_parse_dma_locator(struct ntb_epf_dev *ndev) +{ + if (ndev->ctrl_version < NTB_EPF_CTRL_VERSION_V1) { + ndev->dma_abi =3D 0; + ndev->dma_bar =3D NO_BAR; + ndev->dma_offset =3D 0; + ndev->dma_size =3D 0; + ndev->dma_irq_count =3D 0; + return; + } + + ndev->dma_abi =3D readl(ndev->ctrl_reg + NTB_EPF_DMA_ABI); + ndev->dma_bar =3D readl(ndev->ctrl_reg + NTB_EPF_DMA_BAR); + ndev->dma_offset =3D readl(ndev->ctrl_reg + NTB_EPF_DMA_OFFSET); + ndev->dma_size =3D readl(ndev->ctrl_reg + NTB_EPF_DMA_SIZE); + ndev->dma_num_chans =3D readl(ndev->ctrl_reg + NTB_EPF_DMA_NUM_CHANS); + if (ndev->dma_abi && !ndev->dma_num_chans) + ndev->dma_num_chans =3D 1; + ndev->dma_irq_count =3D ndev->dma_num_chans; +} + static int ntb_epf_init_dev(struct ntb_epf_dev *ndev) { struct device *dev =3D ndev->dev; int ret; =20 - /* One Link interrupt and rest doorbell interrupt */ + ret =3D ntb_epf_parse_ctrl_version(ndev); + if (ret) + return ret; + + ntb_epf_parse_dma_locator(ndev); + + /* + * One Link interrupt and rest doorbell interrupt. + * Remote DMA interrupt is best effort. + */ ret =3D ntb_epf_init_isr(ndev, NTB_EPF_MIN_DB_COUNT + 1, - NTB_EPF_MAX_DB_COUNT + 1); + NTB_EPF_MAX_DB_COUNT + 1 + ndev->dma_irq_count); if (ret) { dev_err(dev, "Failed to init ISR\n"); return ret; --=20 2.51.0