{"id":2197379,"url":"http://patchwork.ozlabs.org/api/1.0/covers/2197379/?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":"<20260217204909.211793-1-zhiw@nvidia.com>","date":"2026-02-17T20:49:05","name":"[v3,0/1] rust: introduce abstractions for fwctl","submitter":{"id":88076,"url":"http://patchwork.ozlabs.org/api/1.0/people/88076/?format=json","name":"Zhi Wang","email":"zhiw@nvidia.com"},"series":[{"id":492476,"url":"http://patchwork.ozlabs.org/api/1.0/series/492476/?format=json","date":"2026-02-17T20:49:05","name":"rust: introduce abstractions for fwctl","version":3,"mbox":"http://patchwork.ozlabs.org/series/492476/mbox/"}],"headers":{"Return-Path":"\n <linux-pci+bounces-47504-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 (2048-bit key;\n unprotected) header.d=Nvidia.com header.i=@Nvidia.com header.a=rsa-sha256\n header.s=selector2 header.b=mqWVuLvS;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c15:e001:75::12fc:5321; helo=sin.lore.kernel.org;\n envelope-from=linux-pci+bounces-47504-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com\n header.b=\"mqWVuLvS\"","smtp.subspace.kernel.org;\n arc=fail smtp.client-ip=52.101.193.35","smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=nvidia.com","smtp.subspace.kernel.org;\n spf=fail smtp.mailfrom=nvidia.com"],"Received":["from sin.lore.kernel.org (sin.lore.kernel.org\n [IPv6:2600:3c15:e001:75::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fFsGM6yW3z1xvq\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 18 Feb 2026 07:50:03 +1100 (AEDT)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sin.lore.kernel.org (Postfix) with ESMTP id 836BA300845E\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 17 Feb 2026 20:50:00 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 5854D29BDB4;\n\tTue, 17 Feb 2026 20:49:58 +0000 (UTC)","from CH1PR05CU001.outbound.protection.outlook.com\n (mail-northcentralusazon11010035.outbound.protection.outlook.com\n [52.101.193.35])\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 C51A02773E4;\n\tTue, 17 Feb 2026 20:49:56 +0000 (UTC)","from PH0PR07CA0084.namprd07.prod.outlook.com (2603:10b6:510:f::29)\n by IA0PR12MB8086.namprd12.prod.outlook.com (2603:10b6:208:403::7) 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 20:49:41 +0000","from CO1PEPF000044F9.namprd21.prod.outlook.com\n (2603:10b6:510:f:cafe::b7) by PH0PR07CA0084.outlook.office365.com\n (2603:10b6:510:f::29) with Microsoft SMTP Server (version=TLS1_3,\n cipher=TLS_AES_256_GCM_SHA384) id 15.20.9632.13 via Frontend Transport; Tue,\n 17 Feb 2026 20:49:40 +0000","from mail.nvidia.com (216.228.117.160) by\n CO1PEPF000044F9.mail.protection.outlook.com (10.167.241.199) with Microsoft\n SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.9654.0 via Frontend Transport; Tue, 17 Feb 2026 20:49:40 +0000","from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com\n (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 17 Feb\n 2026 12:49:20 -0800","from rnnvmail203.nvidia.com (10.129.68.9) by rnnvmail202.nvidia.com\n (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 17 Feb\n 2026 12:49:19 -0800","from inno-thin-ubuntu.nvidia.com (10.127.8.9) by mail.nvidia.com\n (10.129.68.9) with Microsoft SMTP Server id 15.2.2562.20 via Frontend\n Transport; Tue, 17 Feb 2026 12:49:11 -0800"],"ARC-Seal":["i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1771361398; cv=fail;\n b=ryyK5XE2h20hl0qppfNt1mv9XiE2lHjd2L1XVeIHF11zGqDa2AzlBdE2EUHbA4yphgtO4fPR4sXccoXpCH8qzeBXJ9OyXJmMmjZszK0nHjUmz84LEMCI7LtRDjEu3zLc1ZYkR5A4ksGNwvEM7BSozYfaxGAk6Ek+7qRB8C57Hu0=","i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=luZ8tSfzb2wvqhNQs0O2DC2RM/SXry8uYnak/N4hYyPfdwPF14Ud904h3aUZPsmzWIWD0WWUaUyJOViW1rrOZ4S6OYv0ELFnojxq2qjXCJLkkPwMXo77Rw1LV44Kgt6dv2TVggtLEJWoscBfR9+fiwqD8KqDNzMDynBPZ84QVWDNnWXcNEv2t/FpHctiTWlYJW5J381DP65MRbHbfIasH2t5z7G4vpMQiLWQWyiHnfCKQbFUnqgKZgKLIs1GNUw0ZReJrGhUzZmMudRIi18plmzsj+eOSJ8lOAhAmnFfFTNRNIYZ6EKyVSPj1M2Og8tgNrWRe9B4RU/i+tIBAS9NJw=="],"ARC-Message-Signature":["i=2; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1771361398; c=relaxed/simple;\n\tbh=o48Xyus27uJf9FOOH1dIW0K3bd1X20im5psRkjnH/bg=;\n\th=From:To:CC:Subject:Date:Message-ID:MIME-Version:Content-Type;\n b=nrYBxJwQ/vm9cZ0b5J4f8LK/s8dBcWMR7UNuPwlzEdgt5JSCfnOha0ABqGvf5LcQs4s7U1OAja8LZ+91BmC6k5n6n+0kWmH0itHc/W4PPq0JDtUk4fXaE01dqp7Hre63ELdYCJwtsSZuQJR22TeGdgT/v9xGNTL9KD9gysCFHGU=","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=DYsMAXUIPyICa31jW/kFwRjzmNKfOmK9T0Lm0JvgDG4=;\n b=jmNszP76pAOzPcVldLX5dFJeG2vQgCVtE0woVDq2gJackvrUB1szTWPQlB9U/xAn7PY4OGYMPpT74sWEOb82HaysaEbvGZ1DbbNnSQ8soXLdjPhTT3WCdh+5/0sJVLEVAEPgBOUnrBgQe3tUVWMQdmakruzVD9IO0MLqoRiuzGBvLgBX2gr3bN5sGgC1xa2CuQoMi9zD3Ngk02BFjU8gN1r+bKTIP5WUXJzUQemMMIg5aBQuZ957n0PaMzLJDxNTor949UOmqZjTaAD/pwuVx39b6cvUiZhAi5EWIWWvvkYmS9Hs0ZOKfOn2C54kbRQyDLcwaOaBqkaiS69xFzAg7g=="],"ARC-Authentication-Results":["i=2; smtp.subspace.kernel.org;\n dmarc=pass (p=reject dis=none) header.from=nvidia.com;\n spf=fail smtp.mailfrom=nvidia.com;\n dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com\n header.b=mqWVuLvS; arc=fail smtp.client-ip=52.101.193.35","i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 216.228.117.160) smtp.rcpttodomain=vger.kernel.org smtp.mailfrom=nvidia.com;\n dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com;\n dkim=none (message not signed); arc=none (0)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=DYsMAXUIPyICa31jW/kFwRjzmNKfOmK9T0Lm0JvgDG4=;\n b=mqWVuLvSkWDro3/k6Bxi2j0FmnP4wvjLm6EX1Lc1cDFUcWWzsgObprLUYnyBhusFuOMhhvevK1lFm/bjm3zPHSUldMGa4PiAg0i7Z3KGnTYyTv374IzNHxLDM7SZFM1doqMb95FC8E0vmete5zA9wMYhudd7y0PdogpPmquXcKsuvCf4gGIcYM/6qIeCCvln1vs5QK0/gkqdWN77In2Wh/ZSfkxJkhTz9VXAT9QWGGe4K8P8IdbwyFVHpU8YjsyAt3EiV/CDR6+Vu5WAf2vX+NOTD5h3tw8FwsovdDI4ZDzPcfTPlcPBxKK7uPr2KxR2EuKJKVnVx211R5yw4TtF9g==","X-MS-Exchange-Authentication-Results":"spf=pass (sender IP is 216.228.117.160)\n smtp.mailfrom=nvidia.com; dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=nvidia.com;","Received-SPF":"Pass (protection.outlook.com: domain of nvidia.com designates\n 216.228.117.160 as permitted sender) receiver=protection.outlook.com;\n client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C","From":"Zhi Wang <zhiw@nvidia.com>","To":"<rust-for-linux@vger.kernel.org>, <linux-pci@vger.kernel.org>,\n\t<linux-kernel@vger.kernel.org>","CC":"<dakr@kernel.org>, <jgg@nvidia.com>, <gary@garyguo.net>,\n\t<joelagnelf@nvidia.com>, <aliceryhl@google.com>, <bhelgaas@google.com>,\n\t<kwilczynski@kernel.org>, <ojeda@kernel.org>, <alex.gaynor@gmail.com>,\n\t<boqun.feng@gmail.com>, <bjorn3_gh@protonmail.com>, <lossin@kernel.org>,\n\t<a.hindborg@kernel.org>, <tmgross@umich.edu>, <markus.probst@posteo.de>,\n\t<helgaas@kernel.org>, <cjia@nvidia.com>, <smitra@nvidia.com>,\n\t<ankita@nvidia.com>, <aniketa@nvidia.com>, <kwankhede@nvidia.com>,\n\t<targupta@nvidia.com>, <acourbot@nvidia.com>, <jhubbard@nvidia.com>,\n\t<zhiwang@kernel.org>, <daniel.almeida@collabora.com>, Zhi Wang\n\t<zhiw@nvidia.com>","Subject":"[PATCH v3 0/1] rust: introduce abstractions for fwctl","Date":"Tue, 17 Feb 2026 22:49:05 +0200","Message-ID":"<20260217204909.211793-1-zhiw@nvidia.com>","X-Mailer":"git-send-email 2.43.0","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","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"8bit","X-NV-OnPremToCloud":"ExternallySecured","X-EOPAttributedMessage":"0","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"CO1PEPF000044F9:EE_|IA0PR12MB8086:EE_","X-MS-Office365-Filtering-Correlation-Id":"cab2a54b-9a23-4f10-77b6-08de6e661224","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"\n\tBCL:0;ARA:13230040|82310400026|1800799024|376014|7416014|36860700013|13003099007;","X-Microsoft-Antispam-Message-Info":"=?utf-8?q?GX8++0iKGFu3VPaPCwJPCuyK/iDunpK?=\n\t=?utf-8?q?Ng6louGCszjQfoSb7zDdFYSSid5zaQSTlj8UrvBs6gUZsunq2lpbJb8eHCkw58wJu?=\n\t=?utf-8?q?PWky1Qx6yKfeD55vZnQPDurm5NArnf8E2fdkMtbJEHquthmt6XPg/Rq5A72MwQQB0?=\n\t=?utf-8?q?cQ2cGLSFXNX84HOKXz4lU25K0Vm1RVUeFrdrylAKiYbjSIexQlp+hqymZoHs8MT8j?=\n\t=?utf-8?q?Xm80Al4/qaENuBXxrQ77jC7mpKEwprHTwAJs/eJB35N+XAkiJ+qWfbRk0wO8PgtI4?=\n\t=?utf-8?q?0ayPtAJKs4pfham/qxjb6s7f1IMIUwJEqcYeCL0d//g7PIkMn3ztdcrzoE7OLUVxt?=\n\t=?utf-8?q?BO0njL36+3k57TyqKcw3BVjSRsCXQwitp8cU1/uKnDVvwpklRFXByYMExS4ylsBDc?=\n\t=?utf-8?q?VbDFwH7c+dSr9NJ+Kzj+f8Jm6M82u5TpVS+uMLIn69bYOpYkxmMSqz3YU5zqUzWQg?=\n\t=?utf-8?q?lruz64hZgyY4mCPCm2sOKl5femYX4b2Q4nbCBVivXl8b+vZtJ5zFQYuBcA5IfzIk4?=\n\t=?utf-8?q?DYATxviKXYuD+MAxWlKtCZRAKzq06SK4sH1uto9pdUqCmFqXX29xBZNKZA8FZIRVu?=\n\t=?utf-8?q?vv5pI1dQMzFAfL8oUvC09ggFXoNW+3I5C9EhB2cR6I1akbh63FrB6Ne2js/z6/YM6?=\n\t=?utf-8?q?HdU3Clv/CsWPIT4pBkk8iqznRVCoWEl+FeZ82kbN9bbzF3YPppssH6goCCPW9Zf6P?=\n\t=?utf-8?q?68IKboINNw2siqLRa9mRHBlFN2O02W8BbMioM/GuBoxGrDoKrI7kQ4NMdbPWiKHCI?=\n\t=?utf-8?q?8W2feUOwNUOgIMRjIMSBJWqYDtEiHju8lNTK2gwjh6YgReMw3ilsEsUVrJ2BY/fJB?=\n\t=?utf-8?q?lnBZcu1z0hZTPObtp9lEWpn7vq93xuGlUXPWJ1KcYyIbaFoOZ7VZB+2pvjBHoSta+?=\n\t=?utf-8?q?j+SeVnVBjbHNQHv3tAteojRtI3o9gujKtR7dWf4Jb/RXJSzG8QveZvW/3hHUrSO+K?=\n\t=?utf-8?q?Rvm4b9u5dGWQagUk8nCXf324a7aCZK+/agXBR7wt5ekmROGWTJKKsTHlifVLJFtXX?=\n\t=?utf-8?q?9CzwW1OfrD7cOtXuqeMnyomi/4a2PlOo/inu8j5MdUEz/PaCxVukedEeodkUXq8/X?=\n\t=?utf-8?q?RBemOX2RzQc8QxE2avNSMnp+EenHBAJvF+7k78m7OzlJdxMZ37z1sPCtYdWarth8n?=\n\t=?utf-8?q?5TTq3RBxDHv+hxPX3BZKR+6g1quXaCMzLLSOj1Or/Zz31V6JX17RK5oaXPXDvMuEh?=\n\t=?utf-8?q?xld3nVYU27ixhqdirViqAk3P40gTm9nidRipwRDAs1bZAPUM+FsU2Shmu1ktFq27e?=\n\t=?utf-8?q?j5tosgDT0J8DXKZVbFfB02Js6ImIMuMND/9bHhqyrJwm8mwj8Ipb0nhYP7NHLmtql?=\n\t=?utf-8?q?QWbfPyswMBMeNnV39UxJASfm/YVpmZlCmdns+6Ke9lRMS4Rc4gRZ4leOky7XrPPyH?=\n\t=?utf-8?q?hhaF0AD+Tno+J21PFgkTmfXsl4q9WPEJ/r/wUd3nvjjcK+QE/7ul6iktuSI71wNxa?=\n\t=?utf-8?q?TFEUKV32Ycswu1XoqHY+HhnhQAuEcdRc3PxAR0KKKmKvsF2rkfP2RsTpATNdQ/0NN?=\n\t=?utf-8?q?2Y7ocWeYG4KSvmqgRGkGJ1Z5FXLNWPaY3/7Hx2f9t4iPNfH3BhJvbCRh9Ff7UthAS?=\n\t=?utf-8?q?u4VjPVJl7+OmtzZXgFY+TBPt5shlrHUNOmhOXBF1wS9PSSvYECY=3D?=","X-Forefront-Antispam-Report":"\n\tCIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(376014)(7416014)(36860700013)(13003099007);DIR:OUT;SFP:1101;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"\n\trkQM2m1e4tVSgFx+9UhIFfbqQ90s7gE2uE9vlgLmrwTSvV3jCibwY74mGX8ezw1wxo0HnhVYO3qDcAql4k/dqJ++U+/9SgdyCIq34tIxPatfplGVneltPtIbXp4RPib/V/sCsCJXkifzZGA+OjbXde6hubErlwLIlVr4pnoFj5ASF4rqy/2xB9prdiZtS9MGXzVJV8IhI3kQBEQF4B5VisItXU0BcrJdm5Cc4qg6GbZdSGoYwfOZGru4scjq2zliEQ3VBGC/UirBNtBiDvTEIYdXXYpyWGNaEImk+rbolJ4ma+pZwjsrnQTScmtk2L4EypJI3MXAUtGdQ+bvuuFaxjwvHEBUAEZf3rj0AQMnYp9FgSUtw+veuh+2SATX4DE9vFNfzm/szKTUXDbxbx534yRdlq00g+9dgUL2f3fdayK/aT4FsOoYX/4n9QfBmrSF","X-OriginatorOrg":"Nvidia.com","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"17 Feb 2026 20:49:40.1927\n (UTC)","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n cab2a54b-9a23-4f10-77b6-08de6e661224","X-MS-Exchange-CrossTenant-Id":"43083d15-7273-40c1-b7db-39efd9ccc17a","X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp":"\n TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com]","X-MS-Exchange-CrossTenant-AuthSource":"\n\tCO1PEPF000044F9.namprd21.prod.outlook.com","X-MS-Exchange-CrossTenant-AuthAs":"Anonymous","X-MS-Exchange-CrossTenant-FromEntityHeader":"HybridOnPrem","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"IA0PR12MB8086"},"content":"In the NVIDIA vGPU RFC [1], the vGPU type blobs must be provided to the GSP\nbefore userspace can enumerate available vGPU types and create vGPU\ninstances. The original design relied on the firmware loading interface,\nbut fwctl is a more natural fit for this use case, as it is designed for\nuploading configuration or firmware data required before the device becomes\noperational.\n\nThis patch introduces a Rust abstraction over the fwctl subsystem,\nproviding safe and idiomatic bindings.\n\nThe new `fwctl` module allows Rust drivers to integrate with the existing\nC-side fwctl core through a typed trait interface. It provides:\n\n  - `Operations` trait — defines driver-specific callbacks: `open()`,\n    `close()`, `info()`, and `fw_rpc()`. The implementing type itself\n    serves as the per-FD user context, one instance per open().\n\n  - `Device<T>` — wraps `struct fwctl_device` with embedded driver-\n    specific data (`T::DeviceData`).\n\n  - `Registration<T>` — safe registration and automatic unregistration\n    of `struct fwctl_device` objects, living inside `Devres` to ensure\n    teardown before the parent device unbinds.\n\n  - `RpcScope` / `FwRpcResponse` — type-safe enums for RPC scope and\n    response handling, keeping unsafe pointer manipulation confined to\n    the abstraction layer.\n\n`rust/kernel/lib.rs` is updated to conditionally include this module\nunder `CONFIG_FWCTL`.\n\nThe repo with the patches can be found at [2].\n\nv3:\n\nQuite some updates in this version. Here you can find the example\nnova-core fwctl driver [3]. The interface is still WIP so it is just to\ndemonstrate the use of the rust fwctl abstractions.\n\nComments from folks:\n\n- Use an enum for the return of fw_rpc. (Joel)\n- Remove FWCTL_DEVICE_TYPE_RUST_FWCTL_TEST together with the sample\n  driver. (Jason)\n- Remove DeviceType:Error. (Gary)\n- Add __rust_helper for fwctl_get/fwctl_put. (Gary)\n- Refine the design of the device private data. Now it has a similar\n  device private data structure as DRM. (Danilo)\n- Separate fwctl alloc and register in the abstractions. (Jason)\n- Registration::new() now takes &fwctl::Device<T> and the parent\n  &Device<Bound> to align with other class device abstractions. (Danilo)\n- Update the Registration SAFETY comments. (Danilo & Jason)\n- Take self as per-FD user context in callbacks. (Danilo)\n- {open, close}_uctx -> {open, close}(). open() now takes &Device<Self>.\n  (Danilo)\n\nUpdates from me:\n\n- Introduce enums for fwctl RPC scope.\n- Introduce AlwaysRefCounted to avoid hacks after introducing the\n  refined flow of device private data.\n- Introduce default implementation of close()/info().\n- Fix a leak: Drop T::UserCtx in the close_uctx_callback explicitly.\n\nv2:\n\n- Don't open fwctl_put(). Add a rust helper. (Jason/Danilo)\n- Wrap Registration with Devres to guarantee proper lifetime management.\n  (Jason/Danilo)\n- Rename FwctlOps to Operations, FwctlUserCtx to UserCtx, FwctlDevice to\n  Device. (Danilo)\n- Use fwctl::DeviceType enum instead of raw u32 for DEVICE_TYPE. (Danilo)\n- Change fwctl_uctx field in UserCtx to Opaque<bindings::fwctl_uctx> and\n  make it private. (Danilo)\n- Provide Deref and DerefMut implementations for UserCtx::uctx. (Danilo)\n- Add UserCtx::parent_device_from_raw() to simplify parent device access.\n- Use cast() and cast_mut() instead of manual pointer casts. (Danilo)\n- Implement AlwaysRefCounted for Device and use ARef<Device> in\n  Registration. (Danilo)\n- Add rust_helper_fwctl_get() for reference counting.\n- Improve safety comments for slice::from_raw_parts_mut() in\n  fw_rpc_callback. (Danilo)\n- Convert imports to vertical style.\n- Fix all clippy warnings.\n\nv1:\n\n- Initial submission introducing fwctl Rust abstractions.\n\n[1] https://lore.kernel.org/all/20250903221111.3866249-1-zhiw@nvidia.com/\n[2] https://github.com/zhiwang-nvidia/driver-core/tree/fwctl-rust-abstraction-v3\n[3] https://github.com/zhiwang-nvidia/nova-core/commit/2068da7e8caf58da9584b0aa6c81fed8f547d59f\n\nZhi Wang (1):\n  rust: introduce abstractions for fwctl\n\n drivers/fwctl/Kconfig           |  12 +\n rust/bindings/bindings_helper.h |   1 +\n rust/helpers/fwctl.c            |  17 ++\n rust/helpers/helpers.c          |   3 +-\n rust/kernel/fwctl.rs            | 449 ++++++++++++++++++++++++++++++++\n rust/kernel/lib.rs              |   2 +\n 6 files changed, 483 insertions(+), 1 deletion(-)\n create mode 100644 rust/helpers/fwctl.c\n create mode 100644 rust/kernel/fwctl.rs"}