From patchwork Mon Apr 7 19:51:00 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Frank Li X-Patchwork-Id: 14041895 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 8157FC369A1 for ; Mon, 7 Apr 2025 21:48:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:MIME-Version:Cc:To: In-Reply-To:References:Message-Id:Content-Transfer-Encoding:Content-Type: Subject:Date:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=kKlGqegoRweF1++Jqh2S5594pr64Kj2EekHsAJSq3y8=; b=x7GmDa+F4EsoN0QXtOWVfQVzCy xTgQZGor7WHUTb/kpqkGvteY0yhuBQ7VWAQTOkV7/8b+VwprPLg2xBP9lwlnN2CAkUCpdd96cfxNC 2EdC7Deo6XrdmlcJJpXBqZK/hi1U7jBvtxH6mwsO2ee1ThhgGfaXpMvPq3/PaAdO9uRkuhtnK9rzn 76WxBg7BDkG7qQ6mSGBbkZxXpG07eAD2FhI8UOBMmaTHyuXEyTYHePlMl7HLuadEPauGuGtqxyVXI K2RNYOIU7fxgpqATAGrBgTn5+fx1gw9b83KiLOq57fBa86owaeDfYkbm9LWmFdaQ4bWHpQOz3BAqY u5zEvthg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98.1 #2 (Red Hat Linux)) id 1u1uK3-000000026HU-1XWm; Mon, 07 Apr 2025 21:48:03 +0000 Received: from mail-db8eur05on2061e.outbound.protection.outlook.com ([2a01:111:f403:2614::61e] helo=EUR05-DB8-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.98.1 #2 (Red Hat Linux)) id 1u1sVt-00000001sWy-0wx6 for linux-arm-kernel@lists.infradead.org; Mon, 07 Apr 2025 19:52:10 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=W0DjktY4ZR9fjVTvV3baX00VJ0S7tZuj2Zw3v2e/glhXMopZzf5/qLGp2yREa/4aRvQsqLP9X9jflOnhu/NC6xbCckJlEzGnylNlSUC6I7R9vSWSFToHZde7PjN+3KgddMVeEY/d8JAwUrvYg0hFn25POw2Mx04bDMSiWuZlIKEhRCHSWz9JWI9/q1RsKfhODGUhcThzMQSaHTlAj6LkWZXpEFzyFD2GL3eDtzxp7fqynN4mX7fqCJ3GmLG1K3dC6uL4AUOuQc76YSQxX/wEvec3M1bj9FTtwBvjbdrWteHmKBBRzWEDKdb51Stjclzk5wR8Ri9HluEzsowZGBj+Pw== 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=kKlGqegoRweF1++Jqh2S5594pr64Kj2EekHsAJSq3y8=; b=tt6YYDAq6uEeuT/zeG93WpmG80lpnr/HxxdfWQ/zjsBaTTLOt5727ELJfRWuvV/ukD4cwaEmGE+Vs1SMILIbHk2Oht2u6uhiOu43sqPFkn+6YzZj1B3ObgMMydmvq5XWnyXgb2CwynhbqV//xedVqBW0wZ1VA/MccaHbrWcRSjPH3vpRapMrcNUgZsOTk0xNDRnPj4AmzE4EJ6eTx5X0l3/axt0n0k7SRTW5eyR3l7ta1WPR+ymUPb9k+pEeJJgNvtIPfJBxMy/QG7IIb3Orwxe+hQXd1wpX9rpgFitrqyyAZ36BQVNFOyX7t64CNl2AmRXfAlhX0GjSAUMXCTipqw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=kKlGqegoRweF1++Jqh2S5594pr64Kj2EekHsAJSq3y8=; b=S1bgTBOxF+w7153eM4HeNssbO6JWlmpvryF/CVVacaq1BNDe9ld5uPasbQe05MPrY3w2DMeNnxUShrA8exjBKp9qtjY5BK8Hc0Fsvkae08Xx0uivRhIizu32pQICCDoLMa5aBglhvgUCEA0EnoiVYa0rQtrpoPO1IHIrswxKmKEfn4AXFA3AybKlO9PPTl3hg2APVsAqUZfmb9LmZzSrrCElgldcvBJABA9HaGVGONWkjg0UAkpiIXG+G4cgAGi8/wRPMSgR5x7gi5nKr/yqY6yUYD8aKJsd6yVYaFIaPno9tvcTEs3Dfl/8FT8EF9vkSTqczYYJq+t8jWQcjayEgA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXPR04MB9642.eurprd04.prod.outlook.com (2603:10a6:102:240::14) by PR3PR04MB7452.eurprd04.prod.outlook.com (2603:10a6:102:80::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8606.34; Mon, 7 Apr 2025 19:52:06 +0000 Received: from PAXPR04MB9642.eurprd04.prod.outlook.com ([fe80::9126:a61e:341d:4b06]) by PAXPR04MB9642.eurprd04.prod.outlook.com ([fe80::9126:a61e:341d:4b06%2]) with mapi id 15.20.8606.029; Mon, 7 Apr 2025 19:52:06 +0000 From: Frank Li Date: Mon, 07 Apr 2025 15:51:00 -0400 Subject: [PATCH v17 10/15] PCI: endpoint: pci-epf-test: Add doorbell test support Message-Id: <20250407-ep-msi-v17-10-633ab45a31d0@nxp.com> References: <20250407-ep-msi-v17-0-633ab45a31d0@nxp.com> In-Reply-To: <20250407-ep-msi-v17-0-633ab45a31d0@nxp.com> To: Kishon Vijay Abraham I , "Rafael J. Wysocki" , Thomas Gleixner , Anup Patel , Kishon Vijay Abraham I , Marc Zyngier , Greg Kroah-Hartman , "Rafael J. Wysocki" , Danilo Krummrich , Manivannan Sadhasivam , =?utf-8?q?Krzysz?= =?utf-8?q?tof_Wilczy=C5=84ski?= , Kishon Vijay Abraham I , Bjorn Helgaas , Arnd Bergmann , Shuah Khan , Richard Zhu , Lucas Stach , Lorenzo Pieralisi , Rob Herring , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , Krzysztof Kozlowski , Conor Dooley Cc: Niklas Cassel , dlemoal@kernel.org, jdmason@kudzu.us, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, linux-kselftest@vger.kernel.org, imx@lists.linux.dev, devicetree@vger.kernel.org, Frank Li X-Mailer: b4 0.13-dev-e586c X-Developer-Signature: v=1; a=ed25519-sha256; t=1744055468; l=8739; i=Frank.Li@nxp.com; s=20240130; h=from:subject:message-id; bh=GZxnLuC67KA9+f1ZFFupamn6BH671XQaImre37vE7/Q=; b=G1y6ZNLM9mWS55DqIMI5QiC45Wq4mZe5ca3M9jQw9S75HY429CPq+WwLzN/uU/mNDy0MRRbVx wqbn+o3LMwFBJTlbmKZIZ9zAR4a1hPlBUE70oQm4ZWbZOufxQXnG5/N X-Developer-Key: i=Frank.Li@nxp.com; a=ed25519; pk=I0L1sDUfPxpAkRvPKy7MdauTuSENRq+DnA+G4qcS94Q= X-ClientProxiedBy: AS4P189CA0041.EURP189.PROD.OUTLOOK.COM (2603:10a6:20b:5dd::15) To PAXPR04MB9642.eurprd04.prod.outlook.com (2603:10a6:102:240::14) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB9642:EE_|PR3PR04MB7452:EE_ X-MS-Office365-Filtering-Correlation-Id: 4f1d7dfb-9567-43aa-6624-08dd760dad09 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|52116014|366016|1800799024|38350700014|921020; X-Microsoft-Antispam-Message-Info: =?utf-8?q?/SE28wyoDk9C1RdqTAK2fSPla/LDc/w?= =?utf-8?q?As2aX4VGYaVaIM+qVu5wFCWuqdalQdTwScWSt5A9racG+vjoTUWPRcoUtYmwWlaBc?= =?utf-8?q?iRxnjw7mJN+Ir1ZBg6tgKvRjGOaZ/aLAfp2+b8JbsHKZ9Prk2gTJ2EbdHH41I6fgQ?= =?utf-8?q?yke/rHrLK+931LwTDhZ1YpydFn4sp9oN31ebOl37ozZF+zQtKRZMjIpHZyKL4AeDf?= =?utf-8?q?Af+6HePrxzCTFi7i1LqgqWLf6QLgMmxffxi5pXdZ5/d6I9R58VJfFbqTrE+PKIRHu?= =?utf-8?q?vRwm73IQTv5ru/SXxzDgf5UBHzPUYVeliZVs6kQ11gFMzTMpzgKlFeTUWP8FP6IBR?= =?utf-8?q?vsajRWlWWgU2OytHCkDQvqJKvUb/CB/nbOo6Yol82CI6fDGGt71OoQ6NBPVLC+Twm?= =?utf-8?q?sQm5qOB9y1qfyABiUBI9L5YJIolciNvbsHo5CpqJehbwDIqVI8lQmGzzXtFYQ1X2I?= =?utf-8?q?SIu55JYTIrTIRVAcEhcew1joOj+3CLKDFrl1LuYWc1AILYD/GnJ/h/2eLsZVAXT9o?= =?utf-8?q?Bjve4k+vgeZ2MXMnvQcF0Z6kM9QWE4iAPY5L7FGhZEqB/klc1eSJ8WSSMIP93FYWq?= =?utf-8?q?/pSCLn4jR/K78QQNaQotygwy5+K+KdOHN5HVdx5uPsPIyAAZ296KJcdaxOaVxmf9U?= =?utf-8?q?yzE9lYxTfSW3vZ2TuAAY6O7idEhqHGhIWy7EdNkrrItkPP1YQMzahVm9PAsYIJ9cq?= =?utf-8?q?HDTD2k1aWIRMxbIZQyZDspnU0CLUUP3iRpW2EPyQbsVkc83ZV9XgVM1YbED1KjUCE?= =?utf-8?q?TLN2JKb8CZMPk3T3ULlqI68Xh5SLZfLpvAnufBqtIgzRK9/juFm4879pbXWh2SD8Z?= =?utf-8?q?4DH2W2gAL8yr+Oo/a3YvsODcFKldmmYLsDMvERJ8yFgaiFIpfNpL7nyfb9EwW2w6O?= =?utf-8?q?tg9BKa+gaDr/qTXqZINKLong+CYeynRwEFqy47iXmw75MJEQl5Hg2c/C5HqZfxpC5?= =?utf-8?q?PnqQpz6bzUmTKbcjQ2m+bOTcs/BfRIX4ybBhQopcWc2QklxDFmcjVBQUqvBUJixCR?= =?utf-8?q?iaaZNLgB6WRnxnbvfHhhswZaC8z9mosoLZfsNyQgTwWl+LOIA4GrO/ItNfqoGRy7/?= =?utf-8?q?bfCkHY31DQ7YscUOSAysxjnynaQNenPQahXXix9zjDf7815rHc79Udh8PXI4YQ51L?= =?utf-8?q?nOl8icyUb1/KW1Bg64NmKn4V9ZtjSAIoC5F39iQnSeKmK1e8UjATs0xHijlRQGJwr?= =?utf-8?q?GXw7VtDxSuPTH9FtjqtZHwPNDkn3u8qz2r3WsTc8kE7I/ivSuGM6AVkK2sUBgKhzp?= =?utf-8?q?ZaO7jNXocCOvKqMQmHWjZc+mox+EM4CaXvR8+m6zt4UxK+TF7V1YBKAkvPVgfhxvW?= =?utf-8?q?/VJ1Xg8uZG9pxIWvSHfixJqJ5h0mE7hm+NWtZe+b99WxyWBA9XIIFp0H4WIPdX5YR?= =?utf-8?q?P+P/LEX30iBmPoVoDVF03sNHLY6t99uFA=3D=3D?= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR04MB9642.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(376014)(7416014)(52116014)(366016)(1800799024)(38350700014)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?WGPucLY2msun+auLi8S9LpTH7uIU?= =?utf-8?q?d+B7vr+QfsOn+M1P06G9pxJQ7C4wTV0+xzCvunoIHnwsUgi6wNIZ8sB4AnT4LXBoC?= =?utf-8?q?XtoTpybf4qqjDNVmawbsJCxYJVziYzWttirr08PMVvjIUXU6w0fv/uH7Guz2QQPMt?= =?utf-8?q?DO3XL3nnC6LIcihL0ZZYqq8+jdvm0iNE84kRiumSAczr31jxoa54H2fCQ5RGfqKiF?= =?utf-8?q?jhcbk7pLubceNi/k1b8Z54BXWYC384ubo1nMDXH+HRCk7E6yK4zPwJAE64WLcSn4I?= =?utf-8?q?4ahaw5DO8SCsZOFgbWHy2Q3AW+j8ygNZYwAyNKZgABu1Y/OdImyy7RHUms69lyxT+?= =?utf-8?q?ts2G6XAOgiT7MJswYWPWvPyNFJsrHLmsJnGdPxPOyk1UJwucII4Uo5w5Gi3IDEO1v?= =?utf-8?q?L4CWlpi1aId69uiHkoumNPZrIqJqdhQusJ3Ohl2oeJr3jdFOKp7nJ/HyIuW1E0ZD7?= =?utf-8?q?8Zpvtnhb5DYjihrTB6CZslT7sZknqbpQSDHVDSnVsRD1o39/s58ATY/DIoZ0irL7w?= =?utf-8?q?ScfhgjwD3gWZLle7X2Az1fRv2L1/jh8VSi1p8bjwjPcjinbsrfLJOYrEUQtQSmXpL?= =?utf-8?q?9ZADEFAhc8dwVH+V7SUUjlEx5aNaPMewBaM1f/GVWWVFY/WXz/ZuM8nFIChPgyosn?= =?utf-8?q?aYKd8PpdlbSXbyLIpQRCtgyoVO9sCcx/HC3ced7GWUWRByLDk9Mc4SovepDZ+7K6F?= =?utf-8?q?Ka1z4qR55wuKyBlyR+BWeXTD0R8RJA1Vk1FioDvmygou76HtfTkDPFrlGSmIObpVS?= =?utf-8?q?LpKk1GZgKofN26F4NONVMojzwiu1vfN5A3fmBa7vzgpezXLWFW8rClZei85n1rDeH?= =?utf-8?q?igJ4avcPVNX1EPEzpLMLwN99L+PqhSBaiLwA/JUeGvu4E1ksrcySIddQcLUCJpDr8?= =?utf-8?q?cbF38BrH0O3PaWl5yrSX7f8oQybg+AwOfcqRtp25PJnKdCSPZwtbOoy/EmfP7JYZI?= =?utf-8?q?SJjvRu9jkjwsk1w2d/b6/FWxgcp5scDL4Wc7h/EpOhMCDidMOHeB1YprBQL1yTs26?= =?utf-8?q?6Eu6JDEHU8aR7dO3DlSAxoE2FYCp0/r37GVTXEf64ymp1yv6ZbbBMh5axtvkMfn2Y?= =?utf-8?q?LbzNT16gizVUHMn7UR2LVBxh/3sYQ0708ek7s/CyydyvKnbHHq9Bd4sYduRJGd2Y/?= =?utf-8?q?4b9QJta2QpT+Y+7zLw3OoFAg3ToKwyBnj1UY9Hbcz8OT+RlaREYwlwSWHv26i9ZeF?= =?utf-8?q?jPfz2hBfRb9BK39ynhegQpzuUfsl+aD58U7xCMkGFESAeWW62vvtEq7uVXdWv2wwa?= =?utf-8?q?aL5V0sYljcKEh8adhvmtnVz6nscuY6cIv3OGNZHE22iBJoudTQqORmGpKcsHFoirF?= =?utf-8?q?61dpWMmHErPFdVegJlfQTC/1LKM+xiiUc6HiaN6nXDtN9a67g32z/UfcA4fdWZlZj?= =?utf-8?q?yeN/vD0D245NRc79CaDmfQoy1mkgWuKYNIPHe+6xll8EjzFpbYY5t0dIpqlwp89Z3?= =?utf-8?q?bzn7m57CuAXQ/aoL8KcMElKVh1QB8n1g2OpS3AwfvoGs5Kdz3CY/mug6878JOqz/h?= =?utf-8?q?9D5wwsW7V9Ci?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4f1d7dfb-9567-43aa-6624-08dd760dad09 X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB9642.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Apr 2025 19:52:06.7350 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: 9sUCmRmC5nqxDFt7FQrPOzJuHzVVdSOnxwqT/7qaoUKQJLeh+0Xdx4lAWdhDTKo9U6UsPP1bA77gqSg+5IQ7Ug== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PR3PR04MB7452 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250407_125209_405632_6F8D0B89 X-CRM114-Status: GOOD ( 16.85 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Add three registers: doorbell_bar, doorbell_addr, and doorbell_data. Use pci_epf_alloc_doorbell() to allocate a doorbell address space. Enable the Root Complex (RC) side driver to trigger pci-epc-test's doorbell callback handler by writing doorbell_data to the mapped doorbell_bar's address space. Set STATUS_DOORBELL_SUCCESS in the doorbell callback to indicate completion. Avoid breaking compatibility between host and endpoint, add new command COMMAND_ENABLE_DOORBELL and COMMAND_DISABLE_DOORBELL. Host side need send COMMAND_ENABLE_DOORBELL to map one bar's inbound address to MSI space. the command COMMAND_DISABLE_DOORBELL to recovery original inbound address mapping. Host side new driver Host side old driver EP: new driver S F EP: old driver F F S: If EP side support MSI, 'pci_endpoint_test -f pcie_ep_doorbell' return success. If EP side doesn't support MSI, the same to 'F'. F: 'pci_endpoint_test -f pcie_ep_doorbell' return failure, other case as usual. Tested-by: Niklas Cassel Signed-off-by: Frank Li --- change from v15 to v16 - use le32 for doorbell_* register and use cpu_to_le32() and le32_to_cpu() when use it. change from v14 to v15 - none Change from v9 to v14 - update commit message by use pci_endpoint_test -f pcie_ep_doorbell Change from v8 to v9 - move pci_epf_alloc_doorbell() into pci_epf_{enable/disable}_doorbell(). - remove doorbell_done in commit message. - rename pci_epf_{enable/disable}_doorbell() to pci_epf_test_{enable/disable}_doorbell() to align corrent code style. Change from v7 to v8 - rename to pci_epf_align_inbound_addr_lo_hi() Change from v6 to v7 - use help function pci_epf_align_addr_lo_hi() Change from v5 to v6 - rename doorbell_addr to doorbell_offset Chagne from v4 to v5 - Add doorbell free at unbind function. - Move msi irq handler to here to more complex user case, such as differece doorbell can use difference handler function. - Add Niklas's code to handle fixed bar's case. If need add your signed-off tag or co-developer tag, please let me know. change from v3 to v4 - remove revid requirement - Add command COMMAND_ENABLE_DOORBELL and COMMAND_DISABLE_DOORBELL. - call pci_epc_set_bar() to map inbound address to MSI space only at COMMAND_ENABLE_DOORBELL. --- drivers/pci/endpoint/functions/pci-epf-test.c | 142 ++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c index 50eb4106369f4..b9cb1ab218f2b 100644 --- a/drivers/pci/endpoint/functions/pci-epf-test.c +++ b/drivers/pci/endpoint/functions/pci-epf-test.c @@ -11,12 +11,14 @@ #include #include #include +#include #include #include #include #include #include +#include #include #define IRQ_TYPE_INTX 0 @@ -29,6 +31,8 @@ #define COMMAND_READ BIT(3) #define COMMAND_WRITE BIT(4) #define COMMAND_COPY BIT(5) +#define COMMAND_ENABLE_DOORBELL BIT(6) +#define COMMAND_DISABLE_DOORBELL BIT(7) #define STATUS_READ_SUCCESS BIT(0) #define STATUS_READ_FAIL BIT(1) @@ -39,6 +43,11 @@ #define STATUS_IRQ_RAISED BIT(6) #define STATUS_SRC_ADDR_INVALID BIT(7) #define STATUS_DST_ADDR_INVALID BIT(8) +#define STATUS_DOORBELL_SUCCESS BIT(9) +#define STATUS_DOORBELL_ENABLE_SUCCESS BIT(10) +#define STATUS_DOORBELL_ENABLE_FAIL BIT(11) +#define STATUS_DOORBELL_DISABLE_SUCCESS BIT(12) +#define STATUS_DOORBELL_DISABLE_FAIL BIT(13) #define FLAG_USE_DMA BIT(0) @@ -66,6 +75,7 @@ struct pci_epf_test { bool dma_supported; bool dma_private; const struct pci_epc_features *epc_features; + struct pci_epf_bar db_bar; }; struct pci_epf_test_reg { @@ -80,6 +90,9 @@ struct pci_epf_test_reg { __le32 irq_number; __le32 flags; __le32 caps; + __le32 doorbell_bar; + __le32 doorbell_offset; + __le32 doorbell_data; } __packed; static struct pci_epf_header test_header = { @@ -667,6 +680,126 @@ static void pci_epf_test_raise_irq(struct pci_epf_test *epf_test, } } +static irqreturn_t pci_epf_test_doorbell_handler(int irq, void *data) +{ + struct pci_epf_test *epf_test = data; + enum pci_barno test_reg_bar = epf_test->test_reg_bar; + struct pci_epf_test_reg *reg = epf_test->reg[test_reg_bar]; + u32 status = le32_to_cpu(reg->status); + + status |= STATUS_DOORBELL_SUCCESS; + reg->status = cpu_to_le32(status); + pci_epf_test_raise_irq(epf_test, reg); + + return IRQ_HANDLED; +} + +static void pci_epf_test_doorbell_cleanup(struct pci_epf_test *epf_test) +{ + struct pci_epf_test_reg *reg = epf_test->reg[epf_test->test_reg_bar]; + struct pci_epf *epf = epf_test->epf; + + if (le32_to_cpu(reg->doorbell_bar) > 0) { + free_irq(epf->db_msg[0].virq, epf_test); + reg->doorbell_bar = cpu_to_le32(NO_BAR); + } + + if (epf->db_msg) + pci_epf_free_doorbell(epf); +} + +static void pci_epf_test_enable_doorbell(struct pci_epf_test *epf_test, + struct pci_epf_test_reg *reg) +{ + u32 status = le32_to_cpu(reg->status); + struct pci_epf *epf = epf_test->epf; + struct pci_epc *epc = epf->epc; + struct msi_msg *msg; + enum pci_barno bar; + size_t offset; + int ret; + + ret = pci_epf_alloc_doorbell(epf, 1); + if (ret) { + status |= STATUS_DOORBELL_ENABLE_FAIL; + goto set_status; + } + + msg = &epf->db_msg[0].msg; + bar = pci_epc_get_next_free_bar(epf_test->epc_features, epf_test->test_reg_bar + 1); + if (bar < BAR_0 || bar == epf_test->test_reg_bar || !epf->db_msg) { + status |= STATUS_DOORBELL_ENABLE_FAIL; + goto set_status; + } + + ret = request_irq(epf->db_msg[0].virq, pci_epf_test_doorbell_handler, 0, + "pci-test-doorbell", epf_test); + if (ret) { + dev_err(&epf->dev, + "Failed to request irq %d, doorbell feature is not supported\n", + epf->db_msg[0].virq); + status |= STATUS_DOORBELL_ENABLE_FAIL; + pci_epf_test_doorbell_cleanup(epf_test); + goto set_status; + } + + reg->doorbell_data = cpu_to_le32(msg->data); + reg->doorbell_bar = cpu_to_le32(bar); + + msg = &epf->db_msg[0].msg; + ret = pci_epf_align_inbound_addr(epf, bar, ((u64)msg->address_hi << 32) | msg->address_lo, + &epf_test->db_bar.phys_addr, &offset); + + if (ret) { + status |= STATUS_DOORBELL_ENABLE_FAIL; + pci_epf_test_doorbell_cleanup(epf_test); + goto set_status; + } + + reg->doorbell_offset = cpu_to_le32(offset); + + epf_test->db_bar.barno = bar; + epf_test->db_bar.size = epf->bar[bar].size; + epf_test->db_bar.flags = epf->bar[bar].flags; + + ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, &epf_test->db_bar); + if (ret) { + status |= STATUS_DOORBELL_ENABLE_FAIL; + pci_epf_test_doorbell_cleanup(epf_test); + } else { + status |= STATUS_DOORBELL_ENABLE_SUCCESS; + } + +set_status: + reg->status = cpu_to_le32(status); +} + +static void pci_epf_test_disable_doorbell(struct pci_epf_test *epf_test, + struct pci_epf_test_reg *reg) +{ + enum pci_barno bar = le32_to_cpu(reg->doorbell_bar); + u32 status = le32_to_cpu(reg->status); + struct pci_epf *epf = epf_test->epf; + struct pci_epc *epc = epf->epc; + int ret; + + if (bar < BAR_0 || bar == epf_test->test_reg_bar || !epf->db_msg) { + status |= STATUS_DOORBELL_DISABLE_FAIL; + goto set_status; + } + + ret = pci_epc_set_bar(epc, epf->func_no, epf->vfunc_no, &epf->bar[bar]); + if (ret) + status |= STATUS_DOORBELL_DISABLE_FAIL; + else + status |= STATUS_DOORBELL_DISABLE_SUCCESS; + + pci_epf_test_doorbell_cleanup(epf_test); + +set_status: + reg->status = cpu_to_le32(status); +} + static void pci_epf_test_cmd_handler(struct work_struct *work) { u32 command; @@ -714,6 +847,14 @@ static void pci_epf_test_cmd_handler(struct work_struct *work) pci_epf_test_copy(epf_test, reg); pci_epf_test_raise_irq(epf_test, reg); break; + case COMMAND_ENABLE_DOORBELL: + pci_epf_test_enable_doorbell(epf_test, reg); + pci_epf_test_raise_irq(epf_test, reg); + break; + case COMMAND_DISABLE_DOORBELL: + pci_epf_test_disable_doorbell(epf_test, reg); + pci_epf_test_raise_irq(epf_test, reg); + break; default: dev_err(dev, "Invalid command 0x%x\n", command); break; @@ -987,6 +1128,7 @@ static void pci_epf_test_unbind(struct pci_epf *epf) pci_epf_test_clean_dma_chan(epf_test); pci_epf_test_clear_bar(epf); } + pci_epf_test_doorbell_cleanup(epf_test); pci_epf_test_free_space(epf); }