{"id":2197148,"url":"http://patchwork.ozlabs.org/api/1.0/patches/2197148/?format=json","project":{"id":28,"url":"http://patchwork.ozlabs.org/api/1.0/projects/28/?format=json","name":"Linux PCI development","link_name":"linux-pci","list_id":"linux-pci.vger.kernel.org","list_email":"linux-pci@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null},"msgid":"<20260217080601.3808847-10-den@valinux.co.jp>","date":"2026-02-17T08:06:01","name":"[v8,9/9] PCI: endpoint: pci-ep-msi: Add embedded eDMA doorbell fallback","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"55357f1fd7cc1a6d2d467aed2d6a22da302092d0","submitter":{"id":91573,"url":"http://patchwork.ozlabs.org/api/1.0/people/91573/?format=json","name":"Koichiro Den","email":"den@valinux.co.jp"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-pci/patch/20260217080601.3808847-10-den@valinux.co.jp/mbox/","series":[{"id":492390,"url":"http://patchwork.ozlabs.org/api/1.0/series/492390/?format=json","date":"2026-02-17T08:05:52","name":"PCI: endpoint: pci-ep-msi: Add embedded doorbell fallback","version":8,"mbox":"http://patchwork.ozlabs.org/series/492390/mbox/"}],"check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2197148/checks/","tags":{},"headers":{"Return-Path":"\n <linux-pci+bounces-47434-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-pci@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=valinux.co.jp header.i=@valinux.co.jp\n header.a=rsa-sha256 header.s=selector1 header.b=ufXPRn6i;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=172.105.105.114; helo=tor.lore.kernel.org;\n envelope-from=linux-pci+bounces-47434-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp\n header.b=\"ufXPRn6i\"","smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=52.101.229.81","smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=valinux.co.jp","smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=valinux.co.jp","dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=valinux.co.jp;"],"Received":["from tor.lore.kernel.org (tor.lore.kernel.org [172.105.105.114])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fFXMR4XM6z1xpl\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 17 Feb 2026 19:08:19 +1100 (AEDT)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id 3A89C3047BD4\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 17 Feb 2026 08:06:51 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 35BF02E040E;\n\tTue, 17 Feb 2026 08:06:23 +0000 (UTC)","from TY3P286CU002.outbound.protection.outlook.com\n (mail-japaneastazon11020081.outbound.protection.outlook.com [52.101.229.81])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 975C72EBDD3;\n\tTue, 17 Feb 2026 08:06:21 +0000 (UTC)","from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10)\n by OS7P286MB7132.JPNP286.PROD.OUTLOOK.COM (2603:1096:604:42f::6) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9611.16; Tue, 17 Feb\n 2026 08:06:15 +0000","from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM\n ([fe80::2305:327c:28ec:9b32]) by TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM\n ([fe80::2305:327c:28ec:9b32%5]) with mapi id 15.20.9611.013; Tue, 17 Feb 2026\n 08:06:15 +0000"],"ARC-Seal":["i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1771315583; cv=fail;\n b=mofS6dcBRFx2suqxMKa7WkjpEm9BDmWH/qUEWkN10kVBx5WWtrVaC67yXMfttWqLjDBUPr9vndc5QmJbnXW3C581tasyzN50LTO1V5eL2eoi0IO6lElNTcstVZhncK9vL1n+imXlOvGJ0ovajOtxeJjH2tzJue4DE48jYpYfAJw=","i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=yAChYzMrdoR00U3KrodVvJA11xilq2W2ckLTUPQLxKxvKS9WxWEzbKc1q5PDtYHUggDXDCeyfcjaywAoFmGBqNCaxi2Y8CY6Wss7tLIHwn/5fXQmdL2YgRWT1CNkhhZZoxO4GloeCGiCBjPhzq59gW7h7oWXceWJ38oxDblCqSEhVmDnDgxBmqcKmyoRIlEYYs+rGfbWtVFmjKWrqHTDdZCY98ZpaNeyqAYDWAzurTBJuq0QJmerbgdYv/SHYN7aRV+b3BbQa6p20KT7qnCO7xyWP2Xk4zTbEhr9sWkNHYDuHBQCanpSkzdeVZkN+PExdzXHGZHH1MHCL6py50G7YQ=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1771315583; c=relaxed/simple;\n\tbh=lb9k9Kras3OEKJiuzh5fCP1G8ZJS4Mpk8i45PyaUz4c=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t Content-Type:MIME-Version;\n b=jRN4cSRn7ugRzzT2lSZe9A1SRynuOA7hN/r9COr8eZZ6U0zJ0xcZVRukl5XbXAwpcNxbCRItklJMnhATmMaAqdBPORpR/l/Xcp6d3+RLIzofMzK6y5kXvYhr7VzcFK2YeT8ra4C0Xiej3tvN8jP5MbgrMeJk7g/rxPfYHasJb6E=","i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n 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;\n bh=grlMiPTDP7Nc9QwHhLGOZLZFADyNdipGVN7Bdny519A=;\n b=PseIdxXg9vZHuy9slCxyLw07g8Fl7WUEnNCqg1FPtXSYjfAABdmQtLBfUEeu2GQ7BEOY/BAOXpZylNfJH2rNGGIG3dz7CATqtslRXMhSWTmgAEiDE3Yt4bErZHE7KSLJ/R+ia8x3JFVGegZWq70dhfQF2gDz9EM/mYbEebyebp+5iKrA5OZXf9g+9aN2ECtKPJ6qRpHYcIqyN4VbfrrkAuPvUF/xlN6VXSqXawP9e6FeHRGPU/NlhQmhTAjrCNrRI5r+2DQ2XCw/FWOQcP3I6fs0SNZM6vtgnSGEFSZo+bpIWyjYdPbgyCvZYh0P5aUVF1ijd8V1osC8WQK+SOU4ow=="],"ARC-Authentication-Results":["i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=none dis=none) header.from=valinux.co.jp;\n spf=pass smtp.mailfrom=valinux.co.jp;\n dkim=pass (1024-bit key) header.d=valinux.co.jp header.i=@valinux.co.jp\n header.b=ufXPRn6i; arc=fail smtp.client-ip=52.101.229.81","i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=valinux.co.jp; dmarc=pass action=none\n 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;\n s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=grlMiPTDP7Nc9QwHhLGOZLZFADyNdipGVN7Bdny519A=;\n b=ufXPRn6iSMIfDk9NON+7LH+MhJzAnlcZBZdvWvGSM7ODYlYjc9qF/yMzaw8I7rPSckoWR9Y9ZDlHcdLKkX09boVDpLv0o7YI39uBMXihPGWsISa9X4u48VRejbUkcf3nXFIVEez9ubmXoWgAkRB0P978uxiWhhNpDs58RbtFD98=","From":"Koichiro Den <den@valinux.co.jp>","To":"jingoohan1@gmail.com,\n\tmani@kernel.org,\n\tlpieralisi@kernel.org,\n\tkwilczynski@kernel.org,\n\trobh@kernel.org,\n\tbhelgaas@google.com,\n\theiko@sntech.de,\n\tkishon@kernel.org,\n\tjdmason@kudzu.us,\n\tdave.jiang@intel.com,\n\tallenbh@gmail.com,\n\tcassel@kernel.org,\n\tshawn.lin@rock-chips.com,\n\tFrank.Li@nxp.com","Cc":"linux-pci@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tlinux-arm-kernel@lists.infradead.org,\n\tlinux-rockchip@lists.infradead.org,\n\tntb@lists.linux.dev","Subject":"[PATCH v8 9/9] PCI: endpoint: pci-ep-msi: Add embedded eDMA doorbell\n fallback","Date":"Tue, 17 Feb 2026 17:06:01 +0900","Message-ID":"<20260217080601.3808847-10-den@valinux.co.jp>","X-Mailer":"git-send-email 2.51.0","In-Reply-To":"<20260217080601.3808847-1-den@valinux.co.jp>","References":"<20260217080601.3808847-1-den@valinux.co.jp>","Content-Transfer-Encoding":"8bit","Content-Type":"text/plain","X-ClientProxiedBy":"TYCP286CA0281.JPNP286.PROD.OUTLOOK.COM\n (2603:1096:400:3c9::14) To TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM\n (2603:1096:405:38f::10)","Precedence":"bulk","X-Mailing-List":"linux-pci@vger.kernel.org","List-Id":"<linux-pci.vger.kernel.org>","List-Subscribe":"<mailto:linux-pci+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-pci+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"TY7P286MB7722:EE_|OS7P286MB7132:EE_","X-MS-Office365-Filtering-Correlation-Id":"7c509650-cc41-44a2-f211-08de6dfb6c0c","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"\n\tBCL:0;ARA:13230040|366016|376014|1800799024|7416014|10070799003|921020;","X-Microsoft-Antispam-Message-Info":"\n vHcyCrnOBzrlfgMNsEo2by0LBQNZ8Ym8HmYUUjcbSF3Uvn0KmHYf/7qe3cnIAifoLcz9f76/iA2P52qoDVTG+CQ35CZHiCKw0wR3itzGFevptc5xxMPDCNqdHSkdFX905zvmR8xOLwV0WTz7VcknwW+5oJ53C8clxzj++C9yV6EQD51MOlhj+pMmtbnKgjG1stswuUAik0nqcYUkgn4L+8hrDRr9uih6mShLMQlwKoRgoDTp5+z6MfFiWWJgs/8jMLN751Mz9zeHFtKqBf03JqMND7pf48N4zWRTTyk7sVNFNIFt0qhZY+zoAIVlAj6VinI90Zbm/USattuAYYAiWlsmJYwxFo2EkH46eEDO9WUsZNtSpiKS2WpR6Y0lFJe+j1vcE+k2/k3dpJGenliO90+CYzi3px6QdMR3hzUmd7cp8ts8VILfLrCLyb9Kj4hPxocI6zIJnCWnWwAHRnX5GlxTW3mNL+mv7vdlGLDwndgUT0UYI4S2s6hSm5pRCvB0pENkRDDpvgAYH24xHJLZNvI7chU3CuvVdv22zpUP51WxHij8jzHUp0X0RsWgMS0DyWTwTI8EslkWoyMD74kwsJEm1XZjxhO5FCRpqUch7XVxGI+8bEG+G5YP25Q+XlqXZSWt0y8G2JMs/lVyDnybygkZ9j7qfpdOZdQnjU+LBEI7+h2g+gOU2COwDM3GuN82CnDDD0H+Dcnb5U2n1hLNaFVxhzfSd81N4YNlOnI2Bfd12290SOO860LYuYkNxCP2T0DW4o46wU6p6ycOQRGNYZTGi1hlFS1HG9GxiFVadAz322/H+4Qz+rP7QYIPgQprAXwZU7ffdWYj8V2ES5+WwKZ9Ly5LUH27mTTBgJjWaOTyZZ+FGiN5JxVX8ihxdzNV6WKbnm8UXerLEJddU387WnEJbgEgxWuB/HS4+gZEXAOIwbLNtRA62rxPdMg0K+bEpvcbeXrF+mhrJOhF0Lrx37o0QwgPg9OgJPMkZzAs17pJGY8eAXAVQ7/nlRYYioADMVtxMTi9+8qbWhdKitVRZb+znG5bZTnIFZnj67GKTVFDVtLG9xKbGVex9p05mya75J3EZ+r0Ipf3nIUPY7t1oV+igMos5ukTA2UJmIxsNj3+Y5W8Y+9syUPgVUtgL9zNN0r1mTZkMcxXplKrLDFlLWPyQGTjI1nXk3OTBFa0P4aUybTVAeImH0+X3eLwhJdYM7Z+88uTO+68RFEhnkuNQDVNXxYHVpb2xyIjQ4+R7jizHiPpEW3sT8P82i331ROTeUVx/O78FzcW1A9b9IIaxFQMncbfLqrxtDiyX+e3RUcbpT05sdIT7hZk8+CF6enbu+D38U1sBG4cyf+zj5GOzp9FGfzwWusTJLYz1+X5t2njqIGT7NRrW8yEGFdIWD8ygUi83ClFO+End/t2YC3AMn22KUH+q5ys4wdbF4cEtie0LuPvV+ONrpQmV63zjFVt4wPWHy/9kt3m6wylwO4digPytI4I5f898HMRs3XrVj1+4thob8TRe46yQMR3KKGvOWMKfqSZypQWi1vqVOhoptWoyfmci04ofZZ6dgvoQIhW/Uj3S8kCyp+7YwTb7axfJBlZmEA7Ijle3eR9N29ztA==","X-Forefront-Antispam-Report":"\n\tCIP: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)(1800799024)(7416014)(10070799003)(921020);DIR:OUT;SFP:1102;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"\n XUxlVelVumOfIkFMSPfupBFniNjszlJHtE1mJx704lQUSueTXOVG/RsIC+Uh7k3x/NQt0pgHoRXuo7asRFv7wJU/R/XNeOP6qIq8jySwHurGEKY/N1iRjropgN4W2/9GTuZWGQUR79VNJYTBJdcqiLgOe5Q0zQrUEAZ0J0/ER0TkRPib+0hSm99I2B/GgfNZc3TMCUjGZZKkeApTf/FfSJODnRgLdVXOLDbKvDBDI+V8uFPNiV1HIGojN/1KzkELWrfqy+ZbTVLuOr1ldfsTNf4mSTKxBerlRup5AtqD7DKI5IbRIKwmdJbeuo8EkajZ7JLw5xXQ/QOG+XmEQ4ecgb+xHANJuVeoKWuhRocwjTiygWl2KoVh4o52MCbIPD6icAsPE5NuO4Z2fEWupYAlPQBtdu4/7itdOMgnJJQH5HsHb6X8/O0mfi4bpGWDzhAN/M1hkTqVwRXAigZwCnFdU4tk/LrKzywL8y6COYhrrXOUqSX7un2wcf509eCKU58xELsnLNqnCRp4F+DOJ+1WcE45LmrnBTWdmukMdlNPzx5hW/g7BqV4RJTXEkdNCvJ6v1iaZnq9w/M0WckBPQLd9S8qXAlt8bXL0VcVJef45NRp9rd1l1OH5Q1JBxL/mhUxNsng+Sc1F8R4Wq62cvUShU7VTL3ux7ku4zfyzlqt4QaQg5im4jwsc1qfKGcSV7lzeRFM0wRGLeLAigouFO22uXYRpxwMvuLOyEfWEBPXhiRMPok7ddegyI59c9EhTuldOCbLTb7lEA9UEiZzlfbmZxS7/2n2bEEnmIr1EH8W9YazC5HW70TZbzYGf24vti/s69PDHHIl8Y5aPs60F0Awxfty3Lfl5rYJjcPsZPqlfJO5TRc3Ak38qkK9Me+ZGhMcgy5juCRQHRWoo+toGRhUxpQRUnigW67UkTCQtI2fA74uBw76FMnmsKSXyO+OqCLejQlVwPhBpTmR3elXWPw3PdjI40YfN058+kvU0KM8P64roXAX/Eve5TGK+1Nuem/fbIFIKMOjw3v1OwV2FSqEpfQsrUz8KPjbm15NEleSaI7Ku6itGMrBKpZrQ0vyWDjZDuGfU/xSXvKHrjQRb0jW+i9AI7QLh+0Fxi0/m/x8NLwwexsRRca+wPBZDeSSRV8fttBygdJVuItdMRT99kgYwUMYLG0bpVCXfF64aEsk6Rsl6h9BykPqw6JxV91pX9JldUYIQeRa4e4WM/iCqPsA3LzT04x4un5l2jt4gYmEch++L90rVr/qZV7l0NZSqRH95qEwpYIyfVOJhVegmhS5gTH2OROnT09SrIc5GxTBteiRbAJYQ0mS9ESmh3NDB2g5KIiNF5b24Pt3Zcny3RB8JdnXuSDrG5J4tiFMaXAR3A8gp4ec6+9nLj3TOM0UIesDMvwIK25ljQbyUw8MDPGByaOrKu565JbTqbq+9wucfwu4U3iFQsi0IGyuzt9JMzZxnx2o8n4t/hUOQD9Uec8rOtmURkTybE7WQD19vrN4+XdUkMwAIYvjPlFOh3a6KUq2/HkiKwLc+EQSLER6AGpkzE20p2zgyVcO2FYoCdo6x0hJ9C9mQEYKxIUZZhvcHKCTwglF3bbAHzrdmQ33NBUBo2X3QR0wWnlHizUP3lMt1r37F92c2xWd7nXG/SESVDClA83MPsL/NlfRlBhWPHnS5MfUDmrIT6TuJrgKP/xU28O/PzObdgv4El9EDjfq4CEs5JbwKnobcl2r5ztgfWKkGRmy04h7w8y7N/CplbMiW55iKgIh/pTWTcVQzWZsYMgg","X-OriginatorOrg":"valinux.co.jp","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n 7c509650-cc41-44a2-f211-08de6dfb6c0c","X-MS-Exchange-CrossTenant-AuthSource":"TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"17 Feb 2026 08:06:15.0993\n (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":"\n LG3SrRWUpQvyLZDfhnNiIVsuIsOsqabzbUiayWJBkOgvlYT7AAMPPOqjTweqIXIsRcHPMQSmrLSkrmLieeT65Q==","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"OS7P286MB7132"},"content":"Some endpoint platforms cannot use platform MSI / GIC ITS to implement\nEP-side doorbells. In those cases, EPF drivers cannot provide an\ninterrupt-driven doorbell and often fall back to polling.\n\nAdd an \"embedded\" doorbell backend that uses a controller-integrated\ndoorbell target (e.g. DesignWare integrated eDMA interrupt-emulation\ndoorbell).\n\nThe backend locates the doorbell register and a corresponding Linux IRQ\nvia the EPC aux-resource API. If the doorbell register is already\nexposed via a fixed BAR mapping, provide BAR+offset. Otherwise provide\nthe physical address so EPF drivers can map it into BAR space.\n\nWhen MSI doorbell allocation fails with -ENODEV,\npci_epf_alloc_doorbell() falls back to this embedded backend.\n\nSigned-off-by: Koichiro Den <den@valinux.co.jp>\n---\nChanges since v7:\n  - Use designated initializer for consistent styling.\n  - Clean up the pci_epf_alloc_doorbell() error path.\n\n drivers/pci/endpoint/pci-ep-msi.c | 96 ++++++++++++++++++++++++++++++-\n 1 file changed, 94 insertions(+), 2 deletions(-)","diff":"diff --git a/drivers/pci/endpoint/pci-ep-msi.c b/drivers/pci/endpoint/pci-ep-msi.c\nindex 50badffa9d72..66f5a68c81b0 100644\n--- a/drivers/pci/endpoint/pci-ep-msi.c\n+++ b/drivers/pci/endpoint/pci-ep-msi.c\n@@ -6,6 +6,7 @@\n  * Author: Frank Li <Frank.Li@nxp.com>\n  */\n \n+#include <linux/cleanup.h>\n #include <linux/device.h>\n #include <linux/export.h>\n #include <linux/interrupt.h>\n@@ -36,6 +37,84 @@ static void pci_epf_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)\n \tpci_epc_put(epc);\n }\n \n+static int pci_epf_alloc_doorbell_embedded(struct pci_epf *epf, u16 num_db)\n+{\n+\tconst struct pci_epc_aux_resource *doorbell = NULL;\n+\tstruct pci_epf_doorbell_msg *msg;\n+\tstruct pci_epc *epc = epf->epc;\n+\tstruct device *dev = &epf->dev;\n+\tint count, ret, i;\n+\tu64 addr;\n+\n+\tcount = pci_epc_get_aux_resources(epc, epf->func_no, epf->vfunc_no,\n+\t\t\t\t\t  NULL, 0);\n+\tif (count == -EOPNOTSUPP || count == 0)\n+\t\treturn -ENODEV;\n+\tif (count < 0)\n+\t\treturn count;\n+\n+\tstruct pci_epc_aux_resource *res __free(kfree) =\n+\t\t\t\tkcalloc(count, sizeof(*res), GFP_KERNEL);\n+\tif (!res)\n+\t\treturn -ENOMEM;\n+\n+\tret = pci_epc_get_aux_resources(epc, epf->func_no, epf->vfunc_no,\n+\t\t\t\t\tres, count);\n+\tif (ret == -EOPNOTSUPP || ret == 0)\n+\t\treturn -ENODEV;\n+\tif (ret < 0)\n+\t\treturn ret;\n+\n+\tcount = ret;\n+\n+\tfor (i = 0; i < count; i++) {\n+\t\tif (res[i].type == PCI_EPC_AUX_DOORBELL_MMIO) {\n+\t\t\tif (doorbell) {\n+\t\t\t\tdev_warn(dev,\n+\t\t\t\t\t \"Duplicate DOORBELL_MMIO resource found\\n\");\n+\t\t\t\tcontinue;\n+\t\t\t}\n+\t\t\tdoorbell = &res[i];\n+\t\t}\n+\t}\n+\tif (!doorbell)\n+\t\treturn -ENODEV;\n+\n+\tmsg = kcalloc(num_db, sizeof(*msg), GFP_KERNEL);\n+\tif (!msg)\n+\t\treturn -ENOMEM;\n+\n+\taddr = doorbell->phys_addr;\n+\n+\t/*\n+\t * Embedded doorbell backends (e.g. DesignWare eDMA interrupt emulation)\n+\t * typically provide a single IRQ and do not offer per-doorbell\n+\t * distinguishable address/data pairs. The EPC aux resource therefore\n+\t * exposes one DOORBELL_MMIO entry (u.db_mmio.irq).\n+\t *\n+\t * Still, pci_epf_alloc_doorbell() allows requesting multiple doorbells.\n+\t * For such backends we replicate the same address/data for each entry\n+\t * and mark the IRQ as shared (IRQF_SHARED). Consumers must treat them\n+\t * as equivalent \"kick\" doorbells.\n+\t */\n+\tfor (i = 0; i < num_db; i++)\n+\t\tmsg[i] = (struct pci_epf_doorbell_msg) {\n+\t\t\t.msg.address_lo = (u32)addr,\n+\t\t\t.msg.address_hi = (u32)(addr >> 32),\n+\t\t\t.msg.data = doorbell->u.db_mmio.data,\n+\t\t\t.virq = doorbell->u.db_mmio.irq,\n+\t\t\t.irq_flags = IRQF_SHARED,\n+\t\t\t.type = PCI_EPF_DOORBELL_EMBEDDED,\n+\t\t\t.bar = doorbell->bar,\n+\t\t\t.offset = (doorbell->bar == NO_BAR) ? 0 :\n+\t\t\t\t  doorbell->bar_offset,\n+\t\t};\n+\n+\tepf->num_db = num_db;\n+\tepf->db_msg = msg;\n+\treturn 0;\n+}\n+\n static int pci_epf_alloc_doorbell_msi(struct pci_epf *epf, u16 num_db)\n {\n \tstruct pci_epf_doorbell_msg *msg;\n@@ -109,8 +188,21 @@ int pci_epf_alloc_doorbell(struct pci_epf *epf, u16 num_db)\n \tif (!ret)\n \t\treturn 0;\n \n-\tdev_err(dev, \"Failed to allocate doorbell: %d\\n\", ret);\n-\treturn ret;\n+\t/*\n+\t * Fall back to embedded doorbell only when platform MSI is unavailable\n+\t * for this EPC.\n+\t */\n+\tif (ret != -ENODEV)\n+\t\treturn ret;\n+\n+\tret = pci_epf_alloc_doorbell_embedded(epf, num_db);\n+\tif (ret) {\n+\t\tdev_err(dev, \"Failed to allocate doorbell: %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\tdev_info(dev, \"Using embedded (DMA) doorbell fallback\\n\");\n+\treturn 0;\n }\n EXPORT_SYMBOL_GPL(pci_epf_alloc_doorbell);\n \n","prefixes":["v8","9/9"]}