get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2216679/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2216679,
    "url": "http://patchwork.ozlabs.org/api/patches/2216679/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-pci/patch/20260327035422.4020455-8-den@valinux.co.jp/",
    "project": {
        "id": 28,
        "url": "http://patchwork.ozlabs.org/api/projects/28/?format=api",
        "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,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260327035422.4020455-8-den@valinux.co.jp>",
    "list_archive_url": null,
    "date": "2026-03-27T03:54:22",
    "name": "[v12,7/7] PCI: endpoint: pci-ep-msi: Add embedded doorbell fallback",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "90d41558dff34e9d99a4ab6c6b48dbde9f830283",
    "submitter": {
        "id": 91573,
        "url": "http://patchwork.ozlabs.org/api/people/91573/?format=api",
        "name": "Koichiro Den",
        "email": "den@valinux.co.jp"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-pci/patch/20260327035422.4020455-8-den@valinux.co.jp/mbox/",
    "series": [
        {
            "id": 497685,
            "url": "http://patchwork.ozlabs.org/api/series/497685/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-pci/list/?series=497685",
            "date": "2026-03-27T03:54:17",
            "name": "PCI: endpoint: pci-ep-msi: Add embedded doorbell fallback",
            "version": 12,
            "mbox": "http://patchwork.ozlabs.org/series/497685/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2216679/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2216679/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <linux-pci+bounces-51252-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=wSaxy9Nm;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-pci+bounces-51252-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=\"wSaxy9Nm\"",
            "smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=52.101.229.114",
            "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 sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\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 4fhn2520xqz1yFp\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 14:58:53 +1100 (AEDT)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 9807731098B3\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 27 Mar 2026 03:54:50 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 8560536EA93;\n\tFri, 27 Mar 2026 03:54:45 +0000 (UTC)",
            "from TY3P286CU002.outbound.protection.outlook.com\n (mail-japaneastazon11020114.outbound.protection.outlook.com [52.101.229.114])\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 BB5253750A7;\n\tFri, 27 Mar 2026 03:54:41 +0000 (UTC)",
            "from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10)\n by TY7P286MB7090.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:323::16) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9745.20; Fri, 27 Mar\n 2026 03:54:30 +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.9745.019; Fri, 27 Mar 2026\n 03:54:30 +0000"
        ],
        "ARC-Seal": [
            "i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1774583685; cv=fail;\n b=YsH+8BGZ5OCyRTCWfJ0FMF9oRyEhPY+Ak+JGdO34CjSwcEpdd1CLtXfs3grr3EHEi3uzw+0I+1j4I8B/8QhOK2AEHkW9sz8hTHhGW55AJlDufj42nuzGFlHTT7Dc+7TQwL3A+PZHf1FG/4VdqR4eIRDW/o+lFt0gvQqZnTrjPBI=",
            "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=oY+nTS4aTDCIVcx6EIF3nT04ScCDUKiP3fPpKxpkQK9nZSvF3CWplXnJNex/wemdVJhNORic8vlLrn6X0mGU3Nvalz4N/a/7QWjMKIlpQ2VLrV1E/v5VrY6yc0tm6uRh43ir5rgGxZBWYqPT9oKmq+tiGO6moLiDPFqRB7faOUJMEH/zXqq2r1W7sQDx1ETmGS7YYxf7c2qDmnHtyrcSL1bvFPO2GXMCEK5rDo7F8xCipCRr+/47nc6LGS3x5W+p1QhW6vQacGoALd84K7uaFTIGR0ItR+m/9TFHYWqtcnjf0TeeLXQlULzkB2ndwRS2alAt+uUfRWyTgk4wIElN7Q=="
        ],
        "ARC-Message-Signature": [
            "i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1774583685; c=relaxed/simple;\n\tbh=B4rbh1Ems44OpgdoI6e1gh2sq5DROt0kGDzKLXhnZLU=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t Content-Type:MIME-Version;\n b=dyVZQTQie/mhv4UKrOkRhdy8oCJEZC4lcRSd+u9dgbdj+Ca88Fu6qDwoyl66w4otkl0x32VdO9x1Jh28ED5xUdLDrpVFw63AxnMH5oEPyJnpPF0KM2jwUZbKGqdSCorUX09TP613oLYIsbbVKGXQYQaPwyvO4P2oPXkZilfSErs=",
            "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=h/8fb8TGVZ2wRfIziBAcqkzxaIYB/us0nO/tCrP+47w=;\n b=lAydB4llHuuo8s4hD6w5jw3RxycAQyIUUEQhI+FIakqmdAF24x5+CILSAYlnDHYSrPmN0C++ukb4yR87Qum8uzGFkmFyCj8sljhNrDX4mzNjYjK4PtwF/2pM3TVOfIMZ2d5J9qpBJISWcsdQxt33P2gQt0lrfdkwhdOPSdSV9cSVNmyrOIV76jXHmA1/BBhLCBZWRGKiLKN7jRgYpF63VlrTnmp2Fa2GT+NSDVB1O9g0QtypCZBQAt2hJ7Zp+MLYaKIeHpljzsFby3Oi/JVdXFFNg3vzt0KUYojOJQ48q5/yxwW8s7XX+BLIyy4Jg9uNrYqLeA49P+O7ZPep4Qym+A=="
        ],
        "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=wSaxy9Nm; arc=fail smtp.client-ip=52.101.229.114",
            "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=h/8fb8TGVZ2wRfIziBAcqkzxaIYB/us0nO/tCrP+47w=;\n b=wSaxy9Nm1a8bVklDQJb7gxbxk+eQPwCr/5aMNEtKqXHJ5ZJVuHd4bSqKtNHBwfnYLKnZqCa9lY2j4s+Z05J5+RzUa5d8lUbFiY9m+KjrDqpznmD59yXPWMH1bE5eiAf/mo8gR9WPhe8L7uazulzd0lNOdXEu3XiBT4CJEvfEG0M=",
        "From": "Koichiro Den <den@valinux.co.jp>",
        "To": "Jingoo Han <jingoohan1@gmail.com>,\n Manivannan Sadhasivam <mani@kernel.org>,\n Lorenzo Pieralisi <lpieralisi@kernel.org>, =?utf-8?q?Krzysztof_Wilczy=C5=84?=\n\t=?utf-8?q?ski?= <kwilczynski@kernel.org>, Rob Herring <robh@kernel.org>,\n Bjorn Helgaas <bhelgaas@google.com>,\n Kishon Vijay Abraham I <kishon@kernel.org>, Jon Mason <jdmason@kudzu.us>,\n Dave Jiang <dave.jiang@intel.com>, Allen Hubbe <allenbh@gmail.com>,\n Niklas Cassel <cassel@kernel.org>, Frank Li <Frank.Li@nxp.com>,\n Bhanu Seshu Kumar Valluri <bhanuseshukumar@gmail.com>,\n Marco Crivellari <marco.crivellari@suse.com>,\n Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>,\n Manikanta Maddireddy <mmaddireddy@nvidia.com>",
        "Cc": "linux-pci@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tntb@lists.linux.dev",
        "Subject": "[PATCH v12 7/7] PCI: endpoint: pci-ep-msi: Add embedded doorbell\n fallback",
        "Date": "Fri, 27 Mar 2026 12:54:22 +0900",
        "Message-ID": "<20260327035422.4020455-8-den@valinux.co.jp>",
        "X-Mailer": "git-send-email 2.51.0",
        "In-Reply-To": "<20260327035422.4020455-1-den@valinux.co.jp>",
        "References": "<20260327035422.4020455-1-den@valinux.co.jp>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "TY4PR01CA0002.jpnprd01.prod.outlook.com\n (2603:1096:405:26e::19) 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_|TY7P286MB7090:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "aec3e780-6b7f-40a2-a75c-08de8bb48cdc",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "\n\tBCL:0;ARA:13230040|366016|1800799024|10070799003|376014|7416014|921020|18002099003|22082099003|56012099003;",
        "X-Microsoft-Antispam-Message-Info": "\n\taFKNtbKRcQxa/kWF/1of95Z8NJWK1ePTVWTf51OqSUKTBQcxHkJhqFVyv4+zXuK6mUqr9hthGsdCRaTB4/zeIMnCNTP6ZHZzI47rYLS3sMZQEfmUE8WWMcXcHOiWQwHlwIm4PN9iqHW5T+0iUBiEc+5bhIoXTdQawzbeXHLVvdQPCU434978zE8toP3WYEqkchZD8TqvifdxgXFRJCcfgmOjZVegiZkTcI4MfB538qsJZvOMfdIGqSqrIvxRIvk39mffWO1lc8IwuI9l+nEDEGBqYOrawp1pHhKG+DS04vJ9ZRfkcgzVNpvC33694Z94E4ayLYev6edvJk8lZxEdGeYl9LOEzi6GhzpWyqk/HjtzNYftVNcVItl3M/lON789s7UMPGgbcQdEqdI+v6iJTnXEF9Ae3YEQPJZ4Jxmfc7uThmjvi9sqsNv2kxErbxaFy7kwOlOkrdwcBX8M9hjSKU/0C8S6vQwrcVA46avOxG6weQnTdt2DySO9+SHNLXCXJPCX5LyQTSqpPV1fheLOmceGmrH5z0FU95mKZXQDKRL+S3XOyz+i9mSod9gue4dbmwYBrvfZWofQ3vGEU55uso9aKboxx+O95sy/0mdzGJpFtOWlfUxr//XM0eSaa8hSHDjOngiO3QnupPsZtzEBHxNmbi3MU+TsYW5+eOzEaszwMVG/M1R6vPz4/6mCilo5WoT6ih2Z89M2AJ+f0gGsngDTHwWQ1gZvpNBgr6Cs8b6FF1kRSUOr7qbCJX2OXqeq1eSFdWaVsOm+y4bm2HeW1A==",
        "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)(1800799024)(10070799003)(376014)(7416014)(921020)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n tz96X0ItyI4Vc9lsPjoc3gNwpUZRiYCFJnihVDmJVJsyaL1g25yWf1HgA8zSprU1QsQIssrBHoVPkvIjVGvAdtEGE552cLB4rAxPQRdFQqAvVsx3QZkNtwwZSORqwOFE/a02KMu3HAkbzxSBsTfuOwOwC3b/pGVGvYh90ggyD/c3zJhe21FYRsyHbvUPn0lv+QPLJlGmbKkw+ReUOIvKEDUEydWOZ4Pm3fwyH5pxvx5qrIn0qCgW03dc9EjoFCORI8qKgTPhVBwpDz9zAIhTaK/g8XlQlx62wlSp4jzXtd4015xQb0cOgpclBD9lzFOLej3EFDqi8mf35Km889ISQIQvMdUcBI8nPcOcgeTnUiRBmOyXxgCIxNJku5zaDojjRsqctHrDtOcFUIxR1+77Xim8qjHQQw5bulkABjiXSL77vGsxJAmUAX+7bLVPW05vP3CFxWzr6D/gNQgaOm+cR0H4mFTvFznvvhgpgWto4+ntIu620AIhOCHuCsQ9LY/8K2FMP7nyw5KXkUDyBHiQ8vy4VtqpgDDEs2lP5aM6t8KEAk500CquaD694sgxMhMN598PAsu4pZ4EXZ2HjsKKzj8JKgqydll5s1EXQLBD7n+V2N+4kBeGxzbSyyGWJluUhDl5UctOUIQrZ9qLzQbwBxcuyZ/0OeZjUCjbH/phsSxpdffbyVUNKcUBg30kh8CPIqMpRHS81n1ban8IdVAyeNQFqFAqBAXNnqzkcp5gi2rsOssNqAiG71NYPI5ca23KsQwPt0nM3AQtTN6qR/lQoOLi7Vd9DsVjUvnCe2yaLYJH6ozhXqmVhOqggQAN4xLvw6N7D3xBvhR0Td6Vn6AmO0OYpoaIn6YJXWrdVu+zxe3Y3OjV2swy0AFZr+Ut4isI1zIluFtposgU+dSAxhS/+1gZlphGjpVRJT1qtbZvy8eYmh5lhAmg6TaD+nQkmOebNc4QEzIDj8e597v3+Ag9ZvOEYHPwD4E/bgFn5SuXOXYvQ6QPaI4/TxpYdACfrqIyoFEkO9F+/qqYZzvcSMq/M/PldNDFw1JGk+vSgkV+hgauS8HLJHgXCTjwfMihsIZmFe42XpC2Zctzs/uD8Z1k5TzAqx6suKHh/BoGKs4a2tbc7IUiAtXTNGrwG8zJXTARV9nREcMEF+mgUqth/AWB5+NBmUwZFjBEyR6pJIouYy81w8HbnJd7p3DoNIbMFBnpnHvD3KQT/xdjNGMwxE/bou/zw1ShXksP2d3cCjjnc2YZp9E680c7goXnzVKlPauCiDOBTFcsjuJ2qR3fIxvvSqN2AjaXJ/rmNbKehvWMe3TgmQbi6Ei0AM6JMNk6bigYYCfGCuqWN31s2z5y0OnV46/0juLTQjxaF+NitqRcuRVZ+/cEJsrdMKAFLZx6we5aH8KUZ2mpXZ4uIAY1gVk7P8EIWIk6lPq0N0dF7YUjqpkDZayXJL7dias5CZVEZSZhTyKZdylhbs0ZfPo5TvGqbD4eVXXdNm7YS5YIe2yzW983hZUfgWrlDvUsGxhB9D5jKT27i4MLORcgZaDqiBCERlMqegroEC7xX8TXcqqW4ioQIV1BfejSjajaxlIQI0klqzKxh6EwNjSgpJY4f+Cqfc2rvn6lSAIXnHIVLgb7dDu7DT1Zis+6REFrx+KXZACN6hrMHFvesgGwDIeLF7MTJFpZCgxj7gdE2k3eaq3aNfavlCU/VSfHXVh2cNwHPmeIKF0BFhZ4y9aF7CFcNgT20PQvSim1rBimw5hjDBKRZQWZJLFX6I5hTIdECLcX5o8Y",
        "X-OriginatorOrg": "valinux.co.jp",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n aec3e780-6b7f-40a2-a75c-08de8bb48cdc",
        "X-MS-Exchange-CrossTenant-AuthSource": "TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "27 Mar 2026 03:54:30.7524\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 dezn0J2IiOlGeTBIvGd2QAsbUOM2qQl+CDPG1WbQCdvZ8ZUs1w/KZTsqdZYfmblCEmOkZ2AhUbGcUuRVH1TKcA==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "TY7P286MB7090"
    },
    "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 DMA address returned by dma_map_resource() (which may be an IOVA\nwhen an IOMMU is enabled) 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\nSuggested-by: Manivannan Sadhasivam <mani@kernel.org>\nSigned-off-by: Koichiro Den <den@valinux.co.jp>\n---\nChanges in v12:\n  - Use the new pci_epc_count_aux_resources()\n  - Add TODO comment and defer multiple DOORBELL_MMIO resources per EPC\n    case.\n\n drivers/pci/endpoint/pci-ep-msi.c | 135 +++++++++++++++++++++++++++++-\n include/linux/pci-epf.h           |   8 ++\n 2 files changed, 140 insertions(+), 3 deletions(-)",
    "diff": "diff --git a/drivers/pci/endpoint/pci-ep-msi.c b/drivers/pci/endpoint/pci-ep-msi.c\nindex 85fe46103220..0d720556205b 100644\n--- a/drivers/pci/endpoint/pci-ep-msi.c\n+++ b/drivers/pci/endpoint/pci-ep-msi.c\n@@ -6,6 +6,8 @@\n  * Author: Frank Li <Frank.Li@nxp.com>\n  */\n \n+#include <linux/align.h>\n+#include <linux/cleanup.h>\n #include <linux/device.h>\n #include <linux/export.h>\n #include <linux/interrupt.h>\n@@ -36,6 +38,113 @@ 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+\tsize_t map_size = 0, off = 0;\n+\tdma_addr_t iova_base = 0;\n+\tphys_addr_t phys_base;\n+\tint count, ret, i;\n+\tu64 addr;\n+\n+\tret = pci_epc_count_aux_resources(epc, epf->func_no, epf->vfunc_no,\n+\t\t\t\t\t  &count);\n+\tif (ret == -EOPNOTSUPP)\n+\t\treturn -ENODEV;\n+\tif (ret)\n+\t\treturn ret;\n+\tif (!count)\n+\t\treturn -ENODEV;\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)\n+\t\treturn -ENODEV;\n+\tif (ret)\n+\t\treturn ret;\n+\n+\t/* TODO: Support multiple DOORBELL_MMIO resources per EPC. */\n+\tfor (i = 0; i < count; i++) {\n+\t\tif (res[i].type != PCI_EPC_AUX_DOORBELL_MMIO)\n+\t\t\tcontinue;\n+\n+\t\tdoorbell = &res[i];\n+\t\tbreak;\n+\t}\n+\tif (!doorbell)\n+\t\treturn -ENODEV;\n+\taddr = doorbell->phys_addr;\n+\tif (!IS_ALIGNED(addr, sizeof(u32)))\n+\t\treturn -EINVAL;\n+\n+\t/*\n+\t * Reuse the pre-exposed BAR window if available. Otherwise map the MMIO\n+\t * doorbell resource here. Any required IOMMU mapping is handled\n+\t * internally, matching the MSI doorbell semantics.\n+\t */\n+\tif (doorbell->bar == NO_BAR) {\n+\t\tphys_base = addr & PAGE_MASK;\n+\t\toff = addr - phys_base;\n+\t\tmap_size = PAGE_ALIGN(off + sizeof(u32));\n+\n+\t\tiova_base = dma_map_resource(epc->dev.parent, phys_base,\n+\t\t\t\t\t     map_size, DMA_FROM_DEVICE, 0);\n+\t\tif (dma_mapping_error(epc->dev.parent, iova_base))\n+\t\t\treturn -EIO;\n+\n+\t\taddr = iova_base + off;\n+\t}\n+\n+\tmsg = kcalloc(num_db, sizeof(*msg), GFP_KERNEL);\n+\tif (!msg) {\n+\t\tret = -ENOMEM;\n+\t\tgoto err_unmap;\n+\t}\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\t.iova_base = iova_base,\n+\t\t\t.iova_size = map_size,\n+\t\t};\n+\n+\tepf->num_db = num_db;\n+\tepf->db_msg = msg;\n+\treturn 0;\n+\n+err_unmap:\n+\tif (map_size)\n+\t\tdma_unmap_resource(epc->dev.parent, iova_base, map_size,\n+\t\t\t\t   DMA_FROM_DEVICE, 0);\n+\treturn ret;\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,18 +218,38 @@ 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 void pci_epf_free_doorbell(struct pci_epf *epf)\n {\n+\tstruct pci_epf_doorbell_msg *msg0;\n+\tstruct pci_epc *epc = epf->epc;\n+\n \tif (!epf->db_msg)\n \t\treturn;\n \n-\tif (epf->db_msg[0].type == PCI_EPF_DOORBELL_MSI)\n+\tmsg0 = &epf->db_msg[0];\n+\tif (msg0->type == PCI_EPF_DOORBELL_MSI)\n \t\tplatform_device_msi_free_irqs_all(epf->epc->dev.parent);\n+\telse if (msg0->type == PCI_EPF_DOORBELL_EMBEDDED && msg0->iova_size)\n+\t\tdma_unmap_resource(epc->dev.parent, msg0->iova_base,\n+\t\t\t\t   msg0->iova_size, DMA_FROM_DEVICE, 0);\n \n \tkfree(epf->db_msg);\n \tepf->db_msg = NULL;\ndiff --git a/include/linux/pci-epf.h b/include/linux/pci-epf.h\nindex cd747447a1ea..8a6c64a35890 100644\n--- a/include/linux/pci-epf.h\n+++ b/include/linux/pci-epf.h\n@@ -171,6 +171,12 @@ enum pci_epf_doorbell_type {\n  *       (NO_BAR if not)\n  * @offset: offset within @bar for the doorbell target (valid iff\n  *          @bar != NO_BAR)\n+ * @iova_base: Internal: base DMA address returned by dma_map_resource() for the\n+ *             embedded doorbell MMIO window (used only for unmapping). Valid\n+ *             when @type is PCI_EPF_DOORBELL_EMBEDDED and @iova_size is\n+ *             non-zero.\n+ * @iova_size: Internal: size of the dma_map_resource() mapping at @iova_base.\n+ *             Zero when no mapping was created (e.g. pre-exposed fixed BAR).\n  */\n struct pci_epf_doorbell_msg {\n \tstruct msi_msg msg;\n@@ -179,6 +185,8 @@ struct pci_epf_doorbell_msg {\n \tenum pci_epf_doorbell_type type;\n \tenum pci_barno bar;\n \tresource_size_t offset;\n+\tdma_addr_t iova_base;\n+\tsize_t iova_size;\n };\n \n /**\n",
    "prefixes": [
        "v12",
        "7/7"
    ]
}