get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2194477,
    "url": "http://patchwork.ozlabs.org/api/patches/2194477/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-pci/patch/20260209062952.2049053-9-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": "<20260209062952.2049053-9-den@valinux.co.jp>",
    "list_archive_url": null,
    "date": "2026-02-09T06:29:51",
    "name": "[v5,8/8] PCI: endpoint: pci-ep-msi: Add embedded doorbell fallback",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "a9665bf65d57a78ba8757dea17c18a23ed753b03",
    "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/20260209062952.2049053-9-den@valinux.co.jp/mbox/",
    "series": [
        {
            "id": 491464,
            "url": "http://patchwork.ozlabs.org/api/series/491464/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-pci/list/?series=491464",
            "date": "2026-02-09T06:29:44",
            "name": "PCI: endpoint: pci-ep-msi: Add embedded doorbell fallback",
            "version": 5,
            "mbox": "http://patchwork.ozlabs.org/series/491464/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2194477/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2194477/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <linux-pci+bounces-46981-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=lLGrPLGj;\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-46981-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=\"lLGrPLGj\"",
            "smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=40.107.74.75",
            "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 4f8Zcm31msz1xtV\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 09 Feb 2026 17:32:40 +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 AAB273036763\n\tfor <incoming@patchwork.ozlabs.org>; Mon,  9 Feb 2026 06:30:14 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 917D432ABF7;\n\tMon,  9 Feb 2026 06:30:07 +0000 (UTC)",
            "from OS0P286CU010.outbound.protection.outlook.com\n (mail-japanwestazon11021075.outbound.protection.outlook.com [40.107.74.75])\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 4A817329C70;\n\tMon,  9 Feb 2026 06:30:07 +0000 (UTC)",
            "from TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:38f::10)\n by TYYP286MB4425.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:10b::6) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.17; Mon, 9 Feb\n 2026 06:30:06 +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.9587.017; Mon, 9 Feb 2026\n 06:30:06 +0000"
        ],
        "ARC-Seal": [
            "i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1770618607; cv=fail;\n b=sweDVDpez+3NSWs5b88SpMOD6+YchdP/pBG32DuE8aAhjZj8BLyY7iub32V+QptEdA5f+gziImMqgd8LXhuAlUUmGX65RyBuo8YHHD71azmSgPrN9sUNLnB5dqxsQlabQDmTatROb9aaHmM/SVd1Cpv5ZxqPbIjmO3P9Ni42N2g=",
            "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=tTZWe7MKLbRc2au1Rh/0SCJ5+QutHRjULEiBPPWdWBzFYEFRmBDEbA5nge/EI9+bLUTWJcssSbl7j8Hoq4xWhsaCthVWfXZjqPydtIMFCp1EyUC/y/qJa9YRnuxKqtW3/FIeDztUIux/hCGNGKuKZd5WuaOFmTscb396Zsahvbx4o0sEWgWeaGpKEpuhDXvlZrI1k9vOmfgrnEs3wdBUt5ClNRrfLhSXFs5g+PsACf26dCBfKiLX+udPpaK1NmVg7svvKSGzYZlqrPdLaq1AMyHd8kv8NkhjOUaea7+E7lKVrlXDnXeUx3CL8ix9Jdl6notRsrormzNmieW3Y0BSvA=="
        ],
        "ARC-Message-Signature": [
            "i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1770618607; c=relaxed/simple;\n\tbh=a+Si3byFhAbFNwm6vIGylH4T6U5kBsgAetdVIMTYl0Q=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t Content-Type:MIME-Version;\n b=sLGlZ7PZ8Jla0b75CGGUUopyPs7is/4f64pcudsRQeMuDTszYyLyaPkPMrTzIPjuWJK5Ee5H/x8CETXSyurKq7fYc6xO7cDtOk3lAJZ/lGqvSdi1lHfBFL4eIeaa+0QPWC1lDbmPhq5lOB7SeI5acs6mnJ6sasvUH3e2A2dmeEU=",
            "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=iUEjAzmRjNkLbrKJXwiXFi/PoiRu0jia8RIZPv1V3eI=;\n b=lJU1v5D/JA7L4iwSf+Ao/gs6DT/a2TuWAEXcWQ9n+4tPfySu8bK/Z3NgE61UWsz0OpOeuVMf4+P7+3+ImgzdwUjvVf2K6tQZ6qKQcLeX2QBngLl+tbny1ElRX7Ptx8+HO/9JxQ31Y16TMBVexOE4lvPGt4GmYZ08iWqtGUDWIkPIVMpgFElebUIcMgIcgnceV3j/JEYGrsL2iEMI7iYC9qcTvYjpIauZS46e6qCwLfv1FrLV216b4Ur5qrICxcQtbqdIBI6OJenjATvAciaAdGC/jl6rNWj+fqS8beO9fVAYFdPF6b4bR5PM8qcmgx76SpNluPNuAVKbH2n9S9cJkw=="
        ],
        "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=lLGrPLGj; arc=fail smtp.client-ip=40.107.74.75",
            "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=iUEjAzmRjNkLbrKJXwiXFi/PoiRu0jia8RIZPv1V3eI=;\n b=lLGrPLGjupl4EuRKnsAzsHgYgZh+7ncIgWHVOFvymvM5lkC53o46c7UPht/JQdSM7tp0vCXwrAkz8Q8SQgUTSH+5gGBonODeKfYP1+AE6Zgh+kKpp5wo3O3rV37wraU+8iXjvkzCR/u6Xwys8wJF4jyuISYutvYg4Jk9J2KQd/0=",
        "From": "Koichiro Den <den@valinux.co.jp>",
        "To": "vkoul@kernel.org,\n\tmani@kernel.org,\n\tFrank.Li@nxp.com,\n\tcassel@kernel.org,\n\tjingoohan1@gmail.com,\n\tlpieralisi@kernel.org,\n\tkwilczynski@kernel.org,\n\trobh@kernel.org,\n\tbhelgaas@google.com,\n\tkishon@kernel.org,\n\tjdmason@kudzu.us,\n\tallenbh@gmail.com",
        "Cc": "dmaengine@vger.kernel.org,\n\tlinux-pci@vger.kernel.org,\n\tntb@lists.linux.dev,\n\tlinux-kselftest@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org",
        "Subject": "[PATCH v5 8/8] PCI: endpoint: pci-ep-msi: Add embedded doorbell\n fallback",
        "Date": "Mon,  9 Feb 2026 15:29:51 +0900",
        "Message-ID": "<20260209062952.2049053-9-den@valinux.co.jp>",
        "X-Mailer": "git-send-email 2.51.0",
        "In-Reply-To": "<20260209062952.2049053-1-den@valinux.co.jp>",
        "References": "<20260209062952.2049053-1-den@valinux.co.jp>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "TYCP286CA0015.JPNP286.PROD.OUTLOOK.COM\n (2603:1096:400:26c::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_|TYYP286MB4425:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "5755ddb5-1371-454e-406f-08de67a4aa1c",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "\n\tBCL:0;ARA:13230040|7416014|376014|366016|1800799024|10070799003|921020;",
        "X-Microsoft-Antispam-Message-Info": "\n y5VY2b5RTIKJA91iaxTjGkRm0BP8V1wtVkLZToyQgy6zYIeR/LPPEGDh55YiN0VIutqIUuEwBtaGPiVOn0LoC3lkHLr+wu5tNSTOxGIVcqW3nN97vqooex0mrENv5lHgIbp56O3E5CVEJD24PVX2jrbhcU+sxqqdyPOSaHZGpoHKGRtjewB9CMKPRumRjxTpS786/FLPCgmNhmMMOZqnpld0N8EUkgJd4hDjSdCiMbqlGL1pF1ir/oQVIgirpKZ2M9uoetAjcJvwYhCvFulGjLMyHoofeXFZQKLL1SaDXZBwrRuTD8TpE7WUZvbmPVeDGHkqlmw0eR1bqmteUfxxkn6U3QHXFU4dfYltVCId1OL7h0x0x6WNB08jPDktNTJngk9RyKTpELGOgT908eNcWUG42jtiAq4rcN8DbXG7t6AQVXk+4ZpwMBdoNr7era/H3h5v3Aqk6mRxAd5OG1JlvWt0xfnUNd3+8ce9Hu78hR43qYegAyWks0wxal1b36G2TcCyWCtJBp3oeekE2igVufEOfsWc6lKLL7on/x76w+litPGuEjHnRzeaH0XT/8GNfJAGNApMN2VDc8pThmNHxdb8UmouuOT+WWqQ3sN+guyxxM7zak91d9QsrYOfB8o4xWwZlW5X5yUKGVYdHWDWpswJ0EvK7I/vyFMPUq4QVhHPvUE7qcHc/o0prB4GyFyBR148Cxe1twjZVswi0Ihz0NonsVT0CpAECgIHwHoMg0Z8CdGddPiI5u4zO5Yf1kNQ/R9vo29Iar66lG/C1aj5RrOhGrGUrTICsPhCUOxVFe3C7AGxHH3hlykIaytk/iye5Uc59/UYxV4AbOxl2m5F6m06mVFw1+N/qM2QXwLzr2jukGEQsnk/YN00GJZ8M/ZMULXpWh64IUUg8nAkeBzpDoLSNGAPHPf2N1OPDjtuEhY4NJyIjxCQKm5SU/nxAw6/d+ZmhKOa2HPCe2EKtYGisTRRhQfIwChjMFN7TN408EEBb2Gmy39fMgZhDT5ePdmVMMhMl9f+ahdgLzYDbvoy/7hZSUvK3kM+0nkx/217jsRabIiWIzWDo0BVwqF7GzIR3DE4qqw5aBAwOgQmv/wkP4Qf2nlcuV9zfAMnh8c97jBrKeCQnFiFwt1uFaJOAoxMu/cgDh9gpl9i7cJQ8iylVcUiIn+tr3FQwTH5fR2EUHlANXxN48iwSWQQxiXlnBI50BJOQslSFNwWJ6Oq1SslXVg3tIE0nJqwdko8dJHBA2dAOk0oq+4wq6SPdneYE5XJjzqwQouPvyuc1ClW0uNrgVUeohnuZO9cgFPm01qMOhvYimsf3+h2XUjHyGr6CF4eZI7aQBJ1MrmwfiuH0TAqLfg7eCSM5Hf8lEnqnt4VSYAYYDPUSKBVZ2zem3ZEZpuQi9WiNuq5zRHFWOgrBZXztOXqwYFarx4EhEz1eMw49/bQSeU3Y0DAEFEyUqpMWFiOoEplEdDMscAlHbBUJwAJIJYtl6x7VS3rpilW03wVfYoydgBSO7to+WsP1Jfh3/zcNs0rUEI2mLHZwHYe06kdS1JxNASI93YqcL3cx3IiuJa6nfxA+jQEWW5HIKsPYZd9W15m15P9+nZeO2iqf8wVpg==",
        "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)(7416014)(376014)(366016)(1800799024)(10070799003)(921020);DIR:OUT;SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n cJoEDO9BvN0XYU1PcFs9/jVRwbKUSF5ByJXY3IoktVODZar9F4GmXYo7U22zNkzCNj8v6Jmu3S4apR2cBp4klI1pvkDbA7Lw40L6DzYhpF9jZPtmzF0fbC/XuYlflVYNdau/oHFwPHAR/Zdyy9JXth/PNcWOxpI7BPK/8ffyt0Yrp8CM5XrYuXzmWYoWbvSPlfNuobwO858cv4NIQqL+WOTz+Ksbm/qJgIDb3+hmIpzn6nvDDfCryw5X35DsGcjwX/4nb6vyVjmVOhLzjZlHBtiODCpbzO/KsbNIbKGj+uoLVW1XuiurUwo/UR0FXIGaWaWLzWfR0ilJDrTj+xNd0wtDGG9YudkzxLJkDroS42riBRTqwPbprWb8XzbJ7M9/NiV57i4u69dsS/7rtSjGtGc/7q4fo3qx/4gv+U4dpe+1DCDPK8z9lnaSLVmlMzeuSFoHeO16YG8L6W908k/zlgtj9YY0bXrmyypsiQkF3BzeX+TpMeNr/t4rRoJzXWRZUO6R87X0Esax8V3f3ibuxPWb0vb7qFVwAKEUDjYQYc0CdA5C1PA+hoWcb6npMoIfRZ793VJRDFVn10I7TwWaYdPVyf35+Xgj6CBW5i3ZuEOdjiWgemWt5lmAb+e6zBllkDwZS9UpcTFGcTRUU2zKfazzAwVXxwciM5V/lS3FN6rZ8JHIZSZfBmCxDKtnB1YEW7aGc1X3AgDmK4E3qwwoOtCH6xDjz2Teke/jpkfPybGS4O0s7HL5YFqxw9MGm4DiwUrzRoDqky9mK5vfBaqVGTP5rZAcBQAnKbNsRWxq3WEkiOxubWBBd6yhiZBrF+uBkt9X2yphjus19k8OXP7A1o8HhbzoPzcCdV5ArXV+2K9w63ugW6A7QJvrl1X+5jMdAXB/Vkk3rAtHZwwIIJJeD/UZAZ8m0xkc0jFU71EsgySFjrU1qupqGj8xz1yrp/kBF2Ajv+3ldu+SsxJsrZNBZCh59i4DrTCC+LdX/F8441sQHJIuYSyL0IpXq9/4tyjiSiaQ8ArJtu6Lv0HSrWp1rj4m9Pd9wjW4cIeob2QOCBQqZMcvh/LYnJLeXtqiNznd71mj+f+rlAjvB5Qj75k6sXoNJkqg9Nw+AHIs8vOtNgvCldNh618M7Sjy4Gkb2td0smcVmgw+w6fMWhNmGVh40/shRoEqrGcoBsW6+hyMhNEQVATPGVvh89P1plscqQsmYYDBtMp8lZ1CSKIN0McIv6LQNtFGeqR3+/sfaKHwzZN7nNRAv7A9kH1hAPCg9i9T+K1PvbBYkRhKHePfla+vOUXhpWg6aiG+2eICt+nADawP1aRLkD6eKLzYXMqtnmyMW/FZy3/IUzumFqxBwEmo+VAxZUhlBhjJ7cnZvvFqrLaX/4knTHArO6rpBJuHarQtTe2RH6KHfup+VsDBHAYG5o/ZO0mvgaK+m6aUdDskHABZiBZGah09HKBkbQwDig8zAikZaxyLCzb2h63rE9iWBBbX4d03/ZDu5pxv75xW9HsOJUNWhcRZiyPmz7opj5pbqp5aLO93YSW/dJ7GhDS45urNtVv68Hz3dgx1aHSycn/AsydKBNEOdUO9jkIzlr9O7JnV1g73yGVs/8rop4kwo9KbS/3ICXAW37OOpudcYbYiWkgynL5kUvaZXzjADUDyKK9MNW4lcmJD2CStCimu/y05zAparI65bHCxlHfqjLBhmbUcV3XJ90xt2ci4ot7x/c5lPml6i2kL1ZPR7dSDJzL2e1sZVSwMKvRGYjWKjI8LNuO7cA+oUm4UuRLjr2rz",
        "X-OriginatorOrg": "valinux.co.jp",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 5755ddb5-1371-454e-406f-08de67a4aa1c",
        "X-MS-Exchange-CrossTenant-AuthSource": "TY7P286MB7722.JPNP286.PROD.OUTLOOK.COM",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "09 Feb 2026 06:30:06.0095\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 Ayi/qmZ4PnV9NaCq6V/UD4hu/oxUXgCys+lW0Z2UL1KuK1Q+uNOjzP/EIHY9Co018cHWbBP7JtVDxuU/j8nXfw==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "TYYP286MB4425"
    },
    "content": "pci_epf_alloc_doorbell() currently allocates MSI-backed doorbells using\nthe MSI domain returned by of_msi_map_get_device_domain(...,\nDOMAIN_BUS_PLATFORM_MSI). On platforms where such an MSI irq domain is\nnot available, EPF drivers cannot provide doorbells to the RC. Even if\nit's available and MSI device domain successfully created, the write\ninto the message address via BAR inbound mapping might not work for\nplatform-specific reasons (e.g. write into GITS_TRANSLATOR via iATU IB\nmapping does not reach ITS at least on R-Car Gen4 Spider).\n\nAdd an \"embedded (DMA) doorbell\" fallback path that uses EPC-provided\nauxiliary resources to build doorbell address/data pairs backed by a\nplatform device MMIO region (e.g. dw-edma) and a shared platform IRQ.\n\nTo let EPF drivers request interrupts correctly, extend struct\npci_epf_doorbell_msg with the doorbell type and required IRQ request\nflags. Update pci-epf-test to handle shared IRQ constraints by using a\ntrivial primary handler to wake the threaded handler, and update\npci-epf-vntb to use the required irq_flags.\n\nSigned-off-by: Koichiro Den <den@valinux.co.jp>\n---\n drivers/pci/endpoint/functions/pci-epf-test.c |  29 +++-\n drivers/pci/endpoint/functions/pci-epf-vntb.c |   3 +-\n drivers/pci/endpoint/pci-ep-msi.c             | 140 ++++++++++++++++--\n include/linux/pci-epf.h                       |  17 ++-\n 4 files changed, 171 insertions(+), 18 deletions(-)",
    "diff": "diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c\nindex 23034f548c90..2f3b2e6a3e29 100644\n--- a/drivers/pci/endpoint/functions/pci-epf-test.c\n+++ b/drivers/pci/endpoint/functions/pci-epf-test.c\n@@ -711,6 +711,26 @@ static irqreturn_t pci_epf_test_doorbell_handler(int irq, void *data)\n \treturn IRQ_HANDLED;\n }\n \n+/*\n+ * Embedded doorbell fallback uses a platform IRQ which is already owned by a\n+ * platform driver (e.g. dw-edma) and therefore must be requested IRQF_SHARED.\n+ * We cannot add IRQF_ONESHOT here because shared IRQ handlers must agree on\n+ * IRQF_ONESHOT.\n+ *\n+ * request_threaded_irq() with handler == NULL would be rejected for !ONESHOT\n+ * because the default primary handler only wakes the thread and does not\n+ * mask/ack the interrupt, which can livelock on level-triggered IRQs.\n+ *\n+ * In the embedded doorbell fallback, the IRQ owner is responsible for\n+ * acknowledging/deasserting the interrupt source in hardirq context before the\n+ * IRQ line is unmasked. Therefore this driver only needs a trivial primary\n+ * handler to wake the threaded handler.\n+ */\n+static irqreturn_t pci_epf_test_doorbell_primary(int irq, void *data)\n+{\n+\treturn IRQ_WAKE_THREAD;\n+}\n+\n static void pci_epf_test_doorbell_cleanup(struct pci_epf_test *epf_test)\n {\n \tstruct pci_epf_test_reg *reg = epf_test->reg[epf_test->test_reg_bar];\n@@ -731,6 +751,7 @@ static void pci_epf_test_enable_doorbell(struct pci_epf_test *epf_test,\n \tu32 status = le32_to_cpu(reg->status);\n \tstruct pci_epf *epf = epf_test->epf;\n \tstruct pci_epc *epc = epf->epc;\n+\tunsigned long irq_flags;\n \tstruct msi_msg *msg;\n \tenum pci_barno bar;\n \tsize_t offset;\n@@ -745,10 +766,14 @@ static void pci_epf_test_enable_doorbell(struct pci_epf_test *epf_test,\n \tif (bar < BAR_0)\n \t\tgoto err_doorbell_cleanup;\n \n+\tirq_flags = epf->db_msg[0].irq_flags;\n+\tif (!(irq_flags & IRQF_SHARED))\n+\t\tirq_flags |= IRQF_ONESHOT;\n \tepf_test->db_irq_requested = false;\n \n-\tret = request_threaded_irq(epf->db_msg[0].virq, NULL,\n-\t\t\t\t   pci_epf_test_doorbell_handler, IRQF_ONESHOT,\n+\tret = request_threaded_irq(epf->db_msg[0].virq,\n+\t\t\t\t   pci_epf_test_doorbell_primary,\n+\t\t\t\t   pci_epf_test_doorbell_handler, irq_flags,\n \t\t\t\t   \"pci-ep-test-doorbell\", epf_test);\n \tif (ret) {\n \t\tdev_err(&epf->dev,\ndiff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c\nindex 3ecc5059f92b..d2fd1e194088 100644\n--- a/drivers/pci/endpoint/functions/pci-epf-vntb.c\n+++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c\n@@ -535,7 +535,8 @@ static int epf_ntb_db_bar_init_msi_doorbell(struct epf_ntb *ntb,\n \n \tfor (i = 0; i < ntb->db_count; i++) {\n \t\tret = request_irq(epf->db_msg[i].virq, epf_ntb_doorbell_handler,\n-\t\t\t\t  0, \"pci_epf_vntb_db\", ntb);\n+\t\t\t\t  epf->db_msg[i].irq_flags, \"pci_epf_vntb_db\",\n+\t\t\t\t  ntb);\n \n \t\tif (ret) {\n \t\t\tdev_err(&epf->dev,\ndiff --git a/drivers/pci/endpoint/pci-ep-msi.c b/drivers/pci/endpoint/pci-ep-msi.c\nindex ad8a81d6ad77..ebbd24b82ae6 100644\n--- a/drivers/pci/endpoint/pci-ep-msi.c\n+++ b/drivers/pci/endpoint/pci-ep-msi.c\n@@ -8,6 +8,7 @@\n \n #include <linux/device.h>\n #include <linux/export.h>\n+#include <linux/interrupt.h>\n #include <linux/irqdomain.h>\n #include <linux/module.h>\n #include <linux/msi.h>\n@@ -35,23 +36,95 @@ static void pci_epf_write_msi_msg(struct msi_desc *desc, struct msi_msg *msg)\n \tpci_epc_put(epc);\n }\n \n-int pci_epf_alloc_doorbell(struct pci_epf *epf, u16 num_db)\n+static int pci_epf_alloc_doorbell_embedded(struct pci_epf *epf, u16 num_db)\n {\n \tstruct pci_epc *epc = epf->epc;\n-\tstruct device *dev = &epf->dev;\n-\tstruct irq_domain *domain;\n-\tvoid *msg;\n-\tint ret;\n-\tint i;\n+\tconst struct pci_epc_aux_resource *dma_ctrl = NULL;\n+\tstruct pci_epf_doorbell_msg *msg;\n+\tint count, ret, i, db;\n \n-\t/* TODO: Multi-EPF support */\n-\tif (list_first_entry_or_null(&epc->pci_epf, struct pci_epf, list) != epf) {\n-\t\tdev_err(dev, \"MSI doorbell doesn't support multiple EPF\\n\");\n-\t\treturn -EINVAL;\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\tret = -ENODEV;\n+\t\tgoto out_free_res;\n \t}\n+\tif (ret < 0)\n+\t\tgoto out_free_res;\n \n-\tif (epf->db_msg)\n-\t\treturn -EBUSY;\n+\tcount = ret;\n+\n+\tfor (i = 0; i < count; i++) {\n+\t\tif (res[i].type == PCI_EPC_AUX_DMA_CTRL_MMIO) {\n+\t\t\tdma_ctrl = &res[i];\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\tif (!dma_ctrl) {\n+\t\tret = -ENODEV;\n+\t\tgoto out_free_res;\n+\t}\n+\n+\tmsg = kcalloc(num_db, sizeof(*msg), GFP_KERNEL);\n+\tif (!msg) {\n+\t\tret = -ENOMEM;\n+\t\tgoto out_free_res;\n+\t}\n+\n+\tfor (i = 0, db = 0; i < count && db < num_db; i++) {\n+\t\tu64 addr;\n+\n+\t\tif (res[i].type != PCI_EPC_AUX_DMA_CHAN_DESC)\n+\t\t\tcontinue;\n+\n+\t\tif (res[i].u.dma_chan_desc.db_offset >= dma_ctrl->size)\n+\t\t\tcontinue;\n+\n+\t\taddr = (u64)dma_ctrl->phys_addr + res[i].u.dma_chan_desc.db_offset;\n+\n+\t\tmsg[db].msg.address_lo = (u32)addr;\n+\t\tmsg[db].msg.address_hi = (u32)(addr >> 32);\n+\t\tmsg[db].msg.data = 0;\n+\t\tmsg[db].virq = res[i].u.dma_chan_desc.irq;\n+\t\tmsg[db].irq_flags = IRQF_SHARED;\n+\t\tmsg[db].type = PCI_EPF_DOORBELL_EMBEDDED;\n+\t\tdb++;\n+\t}\n+\n+\tif (db != num_db) {\n+\t\tret = -ENOSPC;\n+\t\tkfree(msg);\n+\t\tgoto out_free_res;\n+\t}\n+\n+\tepf->num_db = num_db;\n+\tepf->db_msg = msg;\n+\tret = 0;\n+\n+out_free_res:\n+\tkfree(res);\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+\tstruct device *dev = &epf->dev;\n+\tstruct pci_epc *epc = epf->epc;\n+\tstruct irq_domain *domain;\n+\tint ret, i;\n \n \tdomain = of_msi_map_get_device_domain(epc->dev.parent, 0,\n \t\t\t\t\t      DOMAIN_BUS_PLATFORM_MSI);\n@@ -74,6 +147,11 @@ int pci_epf_alloc_doorbell(struct pci_epf *epf, u16 num_db)\n \tif (!msg)\n \t\treturn -ENOMEM;\n \n+\tfor (i = 0; i < num_db; i++) {\n+\t\tmsg[i].irq_flags = 0;\n+\t\tmsg[i].type = PCI_EPF_DOORBELL_MSI;\n+\t}\n+\n \tepf->num_db = num_db;\n \tepf->db_msg = msg;\n \n@@ -90,13 +168,49 @@ int pci_epf_alloc_doorbell(struct pci_epf *epf, u16 num_db)\n \tfor (i = 0; i < num_db; i++)\n \t\tepf->db_msg[i].virq = msi_get_virq(epc->dev.parent, i);\n \n+\treturn 0;\n+}\n+\n+int pci_epf_alloc_doorbell(struct pci_epf *epf, u16 num_db)\n+{\n+\tstruct pci_epc *epc = epf->epc;\n+\tstruct device *dev = &epf->dev;\n+\tint ret;\n+\n+\t/* TODO: Multi-EPF support */\n+\tif (list_first_entry_or_null(&epc->pci_epf, struct pci_epf, list) != epf) {\n+\t\tdev_err(dev, \"Doorbell doesn't support multiple EPF\\n\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (epf->db_msg)\n+\t\treturn -EBUSY;\n+\n+\tret = pci_epf_alloc_doorbell_msi(epf, num_db);\n+\tif (!ret)\n+\t\treturn 0;\n+\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_info(dev, \"Using embedded (DMA) doorbell fallback\\n\");\n+\t\treturn 0;\n+\t}\n+\n+\tdev_err(dev, \"Failed to allocate doorbell: %d\\n\", ret);\n \treturn ret;\n }\n EXPORT_SYMBOL_GPL(pci_epf_alloc_doorbell);\n \n void pci_epf_free_doorbell(struct pci_epf *epf)\n {\n-\tplatform_device_msi_free_irqs_all(epf->epc->dev.parent);\n+\tif (!epf->db_msg)\n+\t\treturn;\n+\n+\tif (epf->db_msg[0].type == PCI_EPF_DOORBELL_MSI)\n+\t\tplatform_device_msi_free_irqs_all(epf->epc->dev.parent);\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 7737a7c03260..e6625198f401 100644\n--- a/include/linux/pci-epf.h\n+++ b/include/linux/pci-epf.h\n@@ -152,14 +152,27 @@ struct pci_epf_bar {\n \tstruct pci_epf_bar_submap\t*submap;\n };\n \n+enum pci_epf_doorbell_type {\n+\tPCI_EPF_DOORBELL_MSI = 0,\n+\tPCI_EPF_DOORBELL_EMBEDDED,\n+};\n+\n /**\n  * struct pci_epf_doorbell_msg - represents doorbell message\n- * @msg: MSI message\n- * @virq: IRQ number of this doorbell MSI message\n+ * @msg: Doorbell address/data pair to be mapped into BAR space.\n+ *       For MSI-backed doorbells this is the MSI message, while for\n+ *       \"embedded\" doorbells this represents an MMIO write that asserts\n+ *       an interrupt on the EP side.\n+ * @virq: IRQ number of this doorbell message\n+ * @irq_flags: Required flags for request_irq()/request_threaded_irq().\n+ *             Callers may OR-in additional flags (e.g. IRQF_ONESHOT).\n+ * @type: Doorbell type.\n  */\n struct pci_epf_doorbell_msg {\n \tstruct msi_msg msg;\n \tint virq;\n+\tunsigned long irq_flags;\n+\tenum pci_epf_doorbell_type type;\n };\n \n /**\n",
    "prefixes": [
        "v5",
        "8/8"
    ]
}