From nobody Tue Apr 7 12:20:08 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010023.outbound.protection.outlook.com [40.93.198.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9AA1939C628; Wed, 25 Feb 2026 13:43:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.23 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772027036; cv=fail; b=ZvcUF+z3tjwN3A4fhliGEsaZMUwjY5VVVkL2qbjeBkXKI1eYTFWjA9LgiTzWz3cydMg9yV0ZnjKsivgeX6U3V2diGTvpxKHgLxE0czMNwBZ7Nw4zccONlGke5yqE7Zdaxxyhoq9ZEOe7WGetXPmxkTYkzLKoS4p1cUia3XIEuIU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772027036; c=relaxed/simple; bh=4BxMntqXInkTy3mIGhBQUPCxoAXF7oDB0Jmr3UmzXc4=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=Lfssm3jKze8i7YD8tr2OhEbTVKI8I0DXhOdC19nzwSEiA+zLu5DxYJ9s3qgzDuIRl/AKgpa3d71NL4aX21AtK9zrJEWiE6ZmNLBG7E89yb7a6nJvt4O1wKluuKRLecICX6Czeuv99J7GfdgWT/qi0c8tojpY8yxeFxhZD0o++Sc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=VmYPI8dJ; arc=fail smtp.client-ip=40.93.198.23 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="VmYPI8dJ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZbSBP3W852EG/v4kCpbWvdp82JvHwQn8WRDbKcv/PyWRH7EEMlcAa0dvGxbThoRgWkCmN8nHypGfomuGFzCdXv66VHIDVZjqvdFgGHtNxDpXaanEd/F3FuZ9SINqrfJ2QWB3Vo5vy8Zb3dHMZXPho/SLIOoX4ajPCHOhyvw8KG4hgnJrmPZLBKARs+RpxEkzlnLNjYhZHWG3UPwvXTVk4mv92XXkX0H+ZU7Y5R6LG5aHRDE1crPUZrs60wNtizJXKU8rYpy2wn3ds2zG/c+RBUtFTqmWdJXZkSVF4pJSqxy1q++voy7aYxM/eQ37mk8Gpg7kHMibEIViN2CLXVfMFA== 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=x4RMTh2npgSwSFKt722uNsoeEHMhYnCWEJT0GxdcrEA=; b=AUTpB73cA40kBVYlwY823qpvMrfgxTz9WvPxBLIRf0ZsX9gjcgrRZpkJkoNmCTnP42RAevL926fUtkt92bOgTmLunEH6tvTW5Ix8SJfT9DZc1KablroDsoNnFGyb563qD0phhKCXe/chUMiR+1TwyqtMMyU6pp/1r3i9CJOw+FD+QrfDdnUD5qEHjnn/k3Lrj/iopRYjpnslRXBnyUq9+BjdD7lPml4sp1NA/qASCW8qHaE2rwbKUoPuGEMp0UQz0DwPTp2ydkxxCMzVSrsR3Knd54Sk5Ts0EWY1iO2QHekNC9EwIxVG7bxsjzdwLt0+75zwFdzYzOwJdEGbNLDlFQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=x4RMTh2npgSwSFKt722uNsoeEHMhYnCWEJT0GxdcrEA=; b=VmYPI8dJcmPKmVDo/oRHxzkKn2wwRrZn7z+2a5JHOzoRdPpKQ3r7RurMJUfQNWcUhxz8V58qa9ClrsmKKMhoWxa5MZZmGZdXrGw0QBY375+FBxKnUUIPCSDuWNfejEW0KKFPLAEUi7+XQGZ+0K9vkr9K8hCErXALslDZe+OsuQQOyAiddQTQv0TLP0vEw6ktKWJpESTs6q3mX4EKMstkC2gM22bIisQJR4UcI8ltEV6PjQQEj14tc5SiLmd3iAYUYDRbHn2BLyNTS2mCWqwDzrFa2AbyR6UjVo2GWTw2iMkPXuIjipxpI5jvsT3WkXNg/r/ngLG8wlyD1e3flcFoyQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by PH0PR12MB5679.namprd12.prod.outlook.com (2603:10b6:510:14f::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.21; Wed, 25 Feb 2026 13:43:52 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%4]) with mapi id 15.20.9654.007; Wed, 25 Feb 2026 13:43:52 +0000 From: Eliot Courtney Date: Wed, 25 Feb 2026 22:41:48 +0900 Subject: [PATCH 1/4] gpu: nova-core: gsp: fix stale doc comments on command queue methods Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260225-cmdq-locking-v1-1-bbf6b4156706@nvidia.com> References: <20260225-cmdq-locking-v1-0-bbf6b4156706@nvidia.com> In-Reply-To: <20260225-cmdq-locking-v1-0-bbf6b4156706@nvidia.com> To: Danilo Krummrich , Alice Ryhl , Alexandre Courbot , David Airlie , Simona Vetter , Benno Lossin , Gary Guo Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4P286CA0122.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:37c::7) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|PH0PR12MB5679:EE_ X-MS-Office365-Filtering-Correlation-Id: ccd9a8d8-66da-4152-986e-08de7473e98d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: SJfyT6CX9Wr/DW6g7i5sKrv8HVIvkaVLeqbXAUOJCZZl8M6LEKeI7RPZ1gZH2JictHtaXgVI6lNTdWK33TV/8vsW2wjkPO7jnzupkPifZmyKsCiC3LzsNBG5KnwWF/lNvD2EqdJwlUgOU53bk6ZHzN8wNmbN28i+bzMCCgkFe3R8WUrOTUG4RQ6lUrbejQR+IO55dtffcpCLiNlfu1YlQDOHNNadCrGUgg8Dw23W0DtQs+tkwzpWpIboPHB5k9tOj82t6VXuVDbN8Dnlh78uf9RfefHBPDRmGZEGZygcvWuDGPPPXWUVH4a7VEfo31MmAj8gQKO2IIeIZMY8KXIQMTdbpWG9/4GtvkMqumLeZaE7K5I05/mh6pdK9HfTi4xbXOfvANdkIY50MDFnucR3i/FWpMZgb93nS6tlax6VvnotP6EPpPgOqQ7cUfsBJhAIOqhsDQs+nf0k7tnY+g3jRuoJpbNcXUbMRQ8yUfv5WPJ4DsYVrgwLXYYsYbgLOpwQLs9tsE7TYGa4WMkkstBa20XfYGqcd6YE4U/mq/Bfz8VlT1Tkkdz+CxlXPbsxqfHPmYaKrcf7ukEu3nmz6AVXxN0H5knum6wPm32buhz0eEMjlGLACLoywxuEWtE8hEh7Cilg0E2EUsLeEom730I0MllAXzpNjVNHXiVHDWiFtP8TiSZ1AlaQbS8XYbYfDOzmCA29NupLwrsEFjPqKjDy+ukwKLRVi9RdRA0Kmt0Suss= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ZytCbzA4MDJ3Qkxjczd4bTFuTFg2NGE4MlZHZnNJb29malRSc0pEaXVkdU94?= =?utf-8?B?RUM4b3NBTnA0eXJ4YmdpZEtJZzhUQW1VNDFBNlJONnljZnRhbTREUkJZSHpv?= =?utf-8?B?eWQ3YSttcStnYkwxRGlDanlib0RvYWNSQmlSVTl3cVBuYjNoZlJrckRtcHNt?= =?utf-8?B?bGZjZ1h3cWZ6cVVxZlJseWRmb1ZMM3FDSzRMNXNYWmN6Z05BTTN3MWc5Wllk?= =?utf-8?B?TGFmeWpsMXVUb0xkWm9oVzFGalM0Y3pjc2JYbmRmRVpxMDRBN1E0TEV2TDdn?= =?utf-8?B?TjNXM3Z5Y1krbkRLZ3ExWTc4SkhVdGdvL0hNbWt1YnBpWlZoS0RGZzZLbzlM?= =?utf-8?B?S3pGMjFaZmVwaTVweE1YQ0xEYWRLWDVmd0hxRE0yc1l3aGRtYS9PejMzaDZv?= =?utf-8?B?T1lYUGFuUEMrUHFoSE05NVZ1YmdpWERBamZ3Y3dxVkNRS0MvUkNndmxIREtq?= =?utf-8?B?TnFFSFp2aXU3Z0tNZTJFN1Z3ZDFFTktKNVA3TllRWForUlZiMHcrUXNFQWR1?= =?utf-8?B?UFZVbXhVeGx0M1NDbGoyQktYYk1WNFNMSUhsSitTK0dvZmwrWDJ6NEY5WjhS?= =?utf-8?B?NEU0WDNPUnNLc1A0Wlk2ZlprclJrLzl2Zm5waFg0NDFBVkZqMDZ2cUZNSW83?= =?utf-8?B?aUthVHUrWUNkWkhibHpBZUZzVDN2aWxwTm1xU2FuTzBWOS9PNFJ2UTRMNU04?= =?utf-8?B?bG5Mek5tM1RqYXV3SDJ0d2diMnQ1YnZBaXpleVd3UXFaZ3MwZTJldXMzbnRl?= =?utf-8?B?bFFTQTFwR25lb1FmY2pUZ3dET1l6MkFWbUMzTm42VGU5L3RQeFA3cUhIaFBa?= =?utf-8?B?c0VlT0Q5eG5MaFNFZS9Fb2JLczNscGRVdDZjZDVVYjFqZ3g5Q21PS0dXTmQ5?= =?utf-8?B?NmlVektBVmRxMjkzUEp2T3NSZWliVitPUmhUWDdnenBVMi9nRUN4WlgyOXho?= =?utf-8?B?b3dmeXljUXRwSWYzKzl3bEUrNk8yNk9PSGUydU5rbmY3dmF6dWMvdFV5cHNt?= =?utf-8?B?VkFpTXVaVk9GRm1rQTBzUzVSUHNrNXAwZERPRTJRZGJ0NkJMZHNJdXpNN1Rv?= =?utf-8?B?QmxmUXZndVNTMGpMTEZaN0tBMWxRajdzZ256VTUzR1R1NnNnK2hLVjJULzJv?= =?utf-8?B?TDlnYmlDa1k3cktYMitPQ20vU3R3K0R4Q1E4bVFqZmRTRGtjTnpUZ1JjS2VV?= =?utf-8?B?SW1aVlhaaWhpSXp6aG1ySFlmZlBKZmlqWmJPME1Gb3N5OUxYZ2VaeEJDZ1h5?= =?utf-8?B?U2Y3WEx1TlJkUnpGQ0ZTMDBseWRrbFIvQVJ4ZTdMaU14NDJrcXFrbGd0MXRF?= =?utf-8?B?d2pBeDNlRXVMMG9lTnEvbDBMc1UrS2wvY0NIeUxGWG1mMHVsZHc2STlUUVc0?= =?utf-8?B?WnFoaDAzUW5WcDZ2ME9rWURMcTViay9pSnNGWWNqYWtDQUFWSTFkNnp6UDlW?= =?utf-8?B?UTRndHFYbEluakVqcDhSYnpSb2tBa2U5bXd0TGFrcmlXbVZjeXpQeXFPYzhK?= =?utf-8?B?NUpDcitVbjdnTzhKTzlPTXNWOTNuY1lVM3lTZThzbktsWjJFL01xdEtOQUdW?= =?utf-8?B?akk5S1FBd2VSZWZJN29SR1RpVlk4ald0QUdFZzFBZ1JLcnl6MkhmdW00OWQ1?= =?utf-8?B?eGVmT1FvLzJKS05WU3lTRDRVSkNUVjI0OUpGR1BZU29NMkR4MFJzUzJZdVZW?= =?utf-8?B?SkY4RyttNE9MamdVanE0Ylc0K0lFMlYwUDErTUlpYU9FSGpyNzJoaWl1Tk1x?= =?utf-8?B?R1NXd3hiVTZVaVJQL0xGS2VJbEJYN3hwYkJYN242TUFzVkozd1dPQnlKZjJh?= =?utf-8?B?NE0vS0V3Rnc3NFFmQlo3SGhLai9pcENDendNZHlsM1VKTVl2bU81bW1UZElP?= =?utf-8?B?N0s5Slh6SjVNUXBLUDZjRy8wRTlnVUtQY09BQTR3TFd4RzBpTGxiTnZiMVFa?= =?utf-8?B?SU84aWxoSTRjS3RLcDliVnF1dk9Qb29obE84Si95SlI5eXowUGVhWmxnV2pq?= =?utf-8?B?NmR5eFppbXRpczdQanVoeStMU1FtUVVldHRxamVubXkwTlVUR0RxSlBiWDJs?= =?utf-8?B?dnNDa0RPZ29oUVd1OW9RalIvQk5WWGIzbEdrQUtudnp0MEFGSUJERitUdThP?= =?utf-8?B?VUlsYlVFeGdkbUVrN0pTbURIb1Yyd1A5WFJNeUNhVnczZDhFVGF2RFBlbURY?= =?utf-8?B?Vm9NTzlEbzFCSXhEeVJHdGpVVVZJaDgzVi83TlFmVnNOeEJUcVdBSHFhbDZ5?= =?utf-8?B?QS9tMWxxL0srSUFUb0NIOGVabkdROHRFdmZUTzl5TDFwM1dGaGtQWERCM05l?= =?utf-8?B?TitSL2E0UDg4VmVDeVVRQVkwNVYrQzk4NDRVcDhIL2F2QzRBcHg3eEJXMHhO?= =?utf-8?Q?zBl3TcQP6ymiiKg83qexh74beloYYxHbcvwv5gRjwV1NI?= X-MS-Exchange-AntiSpam-MessageData-1: SzQe2hGrksoQYA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: ccd9a8d8-66da-4152-986e-08de7473e98d X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 13:43:52.2585 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: ijsn5RfNsBTxopCkMLCfhVDkp/tFxZu78iSNPg1hPQ1SLJOQQbu+RacgwM9n92r3TYgwbu/ONPgBh8RjH3p+IQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB5679 Fix some inaccuracies / old doc comments. Signed-off-by: Eliot Courtney Reviewed-by: Zhi Wang --- drivers/gpu/nova-core/gsp/cmdq.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 436d1ff20705..cfae5b35adec 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -528,6 +528,7 @@ fn notify_gsp(bar: &Bar0) { /// /// # Errors /// + /// - `EMSGSIZE` if the command exceeds the maximum queue element size. /// - `ETIMEDOUT` if space does not become available within the timeou= t. /// - `EIO` if the variable payload requested by the command has not b= een entirely /// written to by its [`CommandToGsp::init_variable_payload`] method. @@ -710,22 +711,20 @@ fn wait_for_msg(&self, timeout: Delta) -> Result> { =20 /// Receive a message from the GSP. /// - /// `init` is a closure tasked with processing the message. It receive= s a reference to the - /// message in the message queue, and a [`SBufferIter`] pointing to it= s variable-length - /// payload, if any. + /// The expected message type is specified using the `M` generic param= eter. If the pending + /// message has a different function code, `ERANGE` is returned and th= e message is consumed. /// - /// The expected message is specified using the `M` generic parameter.= If the pending message - /// is different, `EAGAIN` is returned and the unexpected message is d= ropped. - /// - /// This design is by no means final, but it is simple and will let us= go through GSP - /// initialization. + /// The read pointer is always advanced past the message, regardless o= f whether it matched. /// /// # Errors /// /// - `ETIMEDOUT` if `timeout` has elapsed before any message becomes = available. /// - `EIO` if there was some inconsistency (e.g. message shorter than= advertised) on the /// message queue. - /// - `EINVAL` if the function of the message was unrecognized. + /// - `EINVAL` if the function code of the message was not recognized. + /// - `ERANGE` if the message had a recognized but non-matching functi= on code. + /// + /// Error codes returned by [`MessageFromGsp::read`] are propagated as= -is. pub(crate) fn receive_msg(&mut self, timeout: Delta= ) -> Result where // This allows all error types, including `Infallible`, to be used= for `M::InitError`. --=20 2.53.0 From nobody Tue Apr 7 12:20:08 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013007.outbound.protection.outlook.com [40.93.196.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7BABD3B95F8; Wed, 25 Feb 2026 13:43:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.7 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772027040; cv=fail; b=fR+1j7sXjTXLU/oKWWM+BVHqo6fFFfYmYD0fqZrKGw8ObWvwW81CDNesLP8mrD8O6zTL8hDK1EVXjhVoNzis/dMUaaCU8n4+Og4GusSLMRjrcEd6fKpWUaTIYJzOb9drj5Dip9P98eE/qRplb30Owl/KXVsfeHlCM/k5xzDe8u8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772027040; c=relaxed/simple; bh=pBgTBBkpbQUF6lbuPyJrLqLMa+aYTg1tCqshi3Ofduo=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=JzXcOqQKbjJz6PXyfWb7C7Z5Q87VsLdeea6Yq2xXr1IUGmVU6MrAY6ZV1bnSwWVx9s3Qq9XApTnmlNQ0GZxtraZoiNF9r4c33EGgHo+F+dpFECCyC2j1nrwZlEY9MvMAHJfTdx9F9Izp3iwwdT8qVY56OvE8pbCSCC747boImLI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=sUJ4DHTc; arc=fail smtp.client-ip=40.93.196.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="sUJ4DHTc" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=lxH8CI1hiNOqoRKpbQfQS26ImpjFnYGKKIBzniGSZbw2OO6W2vpMsium5a9nFTkDG268oTSuM7M2Ww3dEdddAvk4Sw5pdmk2Ug0ae6Rs7MtAoUhrQEdJGLpVMU1K9Z7wYD9FOf+hRD/m0vE76AZZHCi5DePts+XEO4Y3iV9XpdX7KkeHmHPii1s5RAqAuC5YLCVxOpbSspgYnJyJ+fGmTTUvzZqObe3en0D3mFZJNP+O1FUw+ex/oiLNqPALr50ulypBguuNIixo1h3FgCQ/pu74CAMWwhx6g7gGYHTYsSI4ggs5vl5UYJxoVXtK2MHGQF4XSW7wQcJmCSU00AMWAA== 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=uLs2cafLoTB4emoHAYE6jb6dqH4Sg669159GmpZI/rA=; b=M+hjaVJHts9lel61mxB4BuMITAu6e7rwb+QZiNHwmBcDxaI4k6X5xR3wf1IRWQUW7ZlW3xXvwHiAY7pgRZluGwHLdS4h5uRed3CTU/o1H/kdD2PewnNg1xxxpXkqXhPv2ICIgDjHK/1/73kZJP3uAMYSJ9rjr1404YGAvdngEBnlMggTV+MFqOgFHRs78n2O2cwg5FYjygYRBMvwC6CYSs47bkU9r5FyhYk4N8iHRU6YQEqWVsvgIVDbv6X4sqJrERhEIe7W99s1yP6WOkyJ8sHsdXfrA946ex/LHAXjOoP0XajQI2p4ezpS2SzIAaI8qEM9HFPEgLJM4Bsb15Kxkw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=uLs2cafLoTB4emoHAYE6jb6dqH4Sg669159GmpZI/rA=; b=sUJ4DHTcQs5DR5ttQVlFU6iBK2a7FE5fhtT7sF2k8irRbULTk4FxVBblPLzk5KmH2beGptZcna7T5Ky2oR1iHNCY6YcDLtoyUl1YmDRD8l7zRHFLuMT+PmoVfsXpkuvKlPxLAN/2dA/5SeyAfmQ4JdZHUK4SLCa12EMPV8pJrdXgG/8zOmf5UalRQLzYHLxOnr7U3FRGzp0glnuJqCvdcPTHDBfd/IDPHn6DrVHueM+9EFImwZ+64AeR3riUi9Em0DeOYPL6N6GPuq7y99QjUjRHB8+2IklXLRwgCd/shNkSwD8iHQMTyPDyU3wV8Eb3tDaYagGzdYnqFuA10GRgDA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by PH0PR12MB5679.namprd12.prod.outlook.com (2603:10b6:510:14f::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.21; Wed, 25 Feb 2026 13:43:55 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%4]) with mapi id 15.20.9654.007; Wed, 25 Feb 2026 13:43:55 +0000 From: Eliot Courtney Date: Wed, 25 Feb 2026 22:41:49 +0900 Subject: [PATCH 2/4] gpu: nova-core: gsp: add sync and async command queue API to `Cmdq` Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260225-cmdq-locking-v1-2-bbf6b4156706@nvidia.com> References: <20260225-cmdq-locking-v1-0-bbf6b4156706@nvidia.com> In-Reply-To: <20260225-cmdq-locking-v1-0-bbf6b4156706@nvidia.com> To: Danilo Krummrich , Alice Ryhl , Alexandre Courbot , David Airlie , Simona Vetter , Benno Lossin , Gary Guo Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYCPR01CA0031.jpnprd01.prod.outlook.com (2603:1096:405:1::19) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|PH0PR12MB5679:EE_ X-MS-Office365-Filtering-Correlation-Id: 86116302-cd52-49bf-f586-08de7473eb96 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: JoxplmucSjHGogflFVfAOBv/Fqx/LF+Wy2MQNapiy28mS9rRNpcaQ4NGN9Mrju1rzaWaRDjn1rg075SnGKqY9+yEAh9AMmXZRtnEqnt3XpYZABZnOUWaI/Ug/suCHPmGftbhEjAjfk6WKNCJ/3E0ybTvfXeIQ9+IM/Oa3Ybte6GkCpp76RGxFLhiCdQ8tMXEhwP0/z1p4se6q3fhaRtUpkQiJ4vOQc+L330JVbp8JMyg/SIRqYwP4DH/9F9xBhg7BFttBKlq6pCFerrI/Q9sVSZ/Rz28CJ4hDr+Ts7XROPsdzN56H9ESHSvUHZ/Ub6I9r0kceOGQ9vm/C1RhvBh3CTZom8eYSEZMsaIxUC8Jyna4mKiQyrP565LVe1Tit2MeHs/Matv0nr13DjTK8J8EZxVbbYTcpc/ZncvLnX4Q3uMkkcGhERX38RK55Yg1dz4GHRDfawE2c137B9yzLQPNt0adFly35ZRsyNW0YdtubCOudQh7gT1HoXLQZ1kEs09KREtBlz/fh0QGEOthJ9293ujXda9UyA+jLoCWOAS6YzWuPZ8VT1B3rXoXJVv3h9cH230vbLMN5FMCqoCxcFX1zfRQU/I/6nkq4QumnzpQEJNho5iUwSsuws/27nQiVfaqH42KexymuXUp0nE7s0CQJJVoR8gd7ccwHsr36zMQ63OxcR7KodeD6pNyPKlo6CkTkVovB8JUC4pLAQSRPrs6Mh2s44INYaPt4NF/OhYbVc8= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?SVR6T1Bta1BndHV5djM5dEFTY3Jlcm9MY1RxVFFYb2FyZ2VDU05xN01BN21N?= =?utf-8?B?YXdubXlQdGl3YlV6cHZ2YVZTMWVWT3RjNG8xZGVEbEFnTVJidEczWnpnZzA2?= =?utf-8?B?ejRrcHNiUU9uR21jaURnN2h6dEpHTnU2YWZDaEZxNVVrbE11ZnMzcFpocSt2?= =?utf-8?B?WjREYklNUDQ1OHpXWlFib1ZRYUxpYTZqQ2pFMjNtVkQyODVkWmpVbWlwenZX?= =?utf-8?B?M1ZtUm9DTkUzSDNZbnBxTzlnN3h5cUowcWwxRHMrTXlWaDR1QWcxQ2ZGdC9o?= =?utf-8?B?cUxRdmVLRzR3VlBiSWx0b2UvQ0c3QzYrYk5qYjBpN3RreWYwcFk5RzdjamFt?= =?utf-8?B?ckpTU3Ezak9kaitZMVNrNkx3T2VqaHBFLzdoZVBHbWJXQWN5NXNiZkowQ0hC?= =?utf-8?B?cXFSUUpVUnV5VllzYmNCMnhkc1BONGxOOTFQUzNqUisvVDF0SDJwaVBMcHls?= =?utf-8?B?RjErQWhUQjJUa2pGTXVjbE5sUjA2K3RhZm41R1p5Q00vdER6U2phZjZrL1ov?= =?utf-8?B?V1FMWFA0cExFZWxBTnQ3TzhnUFgzNzh3eklKa0E4M3ZsRmwzSGFSSW01YVZk?= =?utf-8?B?NkZkVjhXZWNuOWs5NktTSExOc1dpMVI2Z01TZkQ0MzcvbkQ1dFAzS3F6QlVX?= =?utf-8?B?NFJkdldKVkNXRXFCMzNqbGZOc0l4R2Znc05Vb1VJbVR3dGdlaER0QldsMU1y?= =?utf-8?B?UTN0SkovVHdjSFBCZW1Rcm85alpjeGpYVHZCVWxqQ3MrV1dhMVFiRDFtWUpB?= =?utf-8?B?dFhCZWNZRG5iQkx4SXF2b0JCSzJuV09LY1M0bE05RWkyOTZTVFJ5VUtEbGlq?= =?utf-8?B?QTB1NGhxa2YwdnQrSzlZN05OU3loT0xjUXdxQnRwcG8rL3dSMVhVTGdYbG0z?= =?utf-8?B?c3U3NFpheUFVS0V2VkFzY3o2VnhSekFaeHY1SkZPWVVQTkVFM0xyNGlBck1t?= =?utf-8?B?bHY3Z0lZTjltbUtxKzVJK0FkaHEzWkU4a2xnN3ZYWWNkNnlaQ3c1ZU4yQ29I?= =?utf-8?B?czRlSHBONXVIVTE3bXhON3BVREU2N2lDK3dqM203MFByUHk5dFh5VXFYRHZI?= =?utf-8?B?VUlCbzZPWXVXMzNSTFVUYnVTdDhWaTlJZVdqbmZ4a1VGWFFNaDlvUnVQWitP?= =?utf-8?B?VkRiZEY0MGhSUWZhaGs4Q0xZQlVkYVVpQ2FIRWI5ck53dlcxSEFKK1N6VVBH?= =?utf-8?B?V0pKV1dwZ01VbStGT1liOG03d2p0ZFkwcUFIVXkwMVZUUDQyQXAyRWdiVEgr?= =?utf-8?B?T2JZamxrQS9xd0hsR25nUDRUd0JSc21Ba0lVR2ZnZVRjUWNuOUhyUHF1VFlo?= =?utf-8?B?VUU3MVJVV1czWWFGY0hvbE01SkhBREQ0aGxKZk5ZVTF0U1JGVDJ3ZDc3bDdG?= =?utf-8?B?R1JyT01nY3B1bVFtR2dNRGdYOFZGclBoZS9ZaldadHhMUm0xTzRPZmVKSlhu?= =?utf-8?B?enlZTlVjUTlsMEN2QTQ5YndSYStnb3pXWlBJUUVQV0YzaHR0eDNIM0pGdzJ6?= =?utf-8?B?aTk2OFU3dkNzSzNPdmtURWxIWUVBMnhnWU5ialZxOEZwa1BHOXlYSTFwNEpq?= =?utf-8?B?TndZcU50T21YZjdEblZEek83d3RqOG82NE41YUc1L2k1MitVQVkvL1hvdzRO?= =?utf-8?B?RUJzVXVmY2RhNUIyQm8vZFBCb3V2TmV5OHY3SWk2SWlzQnNmZVlPTGlrcmtl?= =?utf-8?B?TEVjdXBMaHlCbFVyd0pVeFkvTHdOYyt1S3R5Qnh5NUtrSWhpTkVUN1hBOVFi?= =?utf-8?B?VzlPUFhoblQ0WmRIWWRPb2wxbC9RZGMxa2MwZHozMCtETVk1LzZvVUN6TGFL?= =?utf-8?B?L2NIQjdtSE1XWTdkU0NyaFJUTWM3RzkzczRIWkVpYi9NS2VIdWVicWFlbzVi?= =?utf-8?B?R0I1YVlNYS9SR1Ezd05kVzZ6bmw5S3BIMjE2bDhMVytKRHVxOS9lWXAwYTJH?= =?utf-8?B?TzlUWGVUbldseFlpMVpldFV1Q1Z1c2ZXOTljRWJsaFRTL0FqTUlLSFpyVXJj?= =?utf-8?B?SEFIWjdrTDZSdW4yeHZpaHBKck1JRjNHZHZNaWJXdE9KcXBHZHFuYzhHNHJS?= =?utf-8?B?MGQ0ZVl4eDFrOTBDM1Z2NlE4djhBam9ReHEyNkRMSGYrV3lSQzBvNjlUVmRZ?= =?utf-8?B?bFZCbW1ZMUVsT0tZQng0aXpoSGIxUUN2NUkzclFNWkMwVTcyTDhwcHM2ZTdL?= =?utf-8?B?VXByVEdObTVxNlIvWXJVWk9Xb1BJd1U3Q3pUSTNGWVRGdGM0YWUwVmNycEhs?= =?utf-8?B?cnhMb2tyditMM2RvU3I0WXN6OFp5ZkM5YXhoT2oraXdIZ3pPWXh3dkd1TzFo?= =?utf-8?B?SHEwMFdndEZqZGRCMmhmK3AxeldMT1pPbmJLbFoyWW5EQ1VPRTltWk9BbHhu?= =?utf-8?Q?U70hjtOpIdymkwIJmfZPrei2ooZC5NjXa8DrdovNLNcHI?= X-MS-Exchange-AntiSpam-MessageData-1: i+cbOWnjqreB9Q== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 86116302-cd52-49bf-f586-08de7473eb96 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 13:43:55.8101 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: cBIaMg+O8HY2p65gIglSbveNgz6Vu2l05qgwjJpO01fl5eO0o7s98733lRVVXnTwNS7h5tYLZCelB4f6sZbBhg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB5679 Add sync and async command queue API and the type infrastructure to know what reply is expected from each `CommandToGsp`. Use a marker type `NoReply` which does not implement `MessageFromGsp` to mark async commands which don't expect a response. This prepares for adding locking to the queue. Signed-off-by: Eliot Courtney --- drivers/gpu/nova-core/gsp/boot.rs | 5 ++-- drivers/gpu/nova-core/gsp/cmdq.rs | 54 +++++++++++++++++++++++++++++++= +++- drivers/gpu/nova-core/gsp/commands.rs | 19 ++++++------ 3 files changed, 65 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index be427fe26a58..1cb21da855b9 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -160,8 +160,9 @@ pub(crate) fn boot( dma_write!(wpr_meta[0] =3D GspFwWprMeta::new(&gsp_fw, &fb_layout))= ?; =20 self.cmdq - .send_command(bar, commands::SetSystemInfo::new(pdev))?; - self.cmdq.send_command(bar, commands::SetRegistry::new())?; + .send_async_command(bar, commands::SetSystemInfo::new(pdev))?; + self.cmdq + .send_async_command(bar, commands::SetRegistry::new())?; =20 gsp_falcon.reset(bar)?; let libos_handle =3D self.libos.dma_handle(); diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index cfae5b35adec..e1ca1bb9e07d 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -48,6 +48,10 @@ sbuffer::SBufferIter, // }; =20 +/// Marker type representing the absence of a reply for a command. This do= es not implement +/// `MessageFromGsp`. +pub(crate) struct NoReply; + /// Trait implemented by types representing a command to send to the GSP. /// /// The main purpose of this trait is to provide [`Cmdq::send_command`] wi= th the information it @@ -66,6 +70,9 @@ pub(crate) trait CommandToGsp { /// Type generated by [`CommandToGsp::init`], to be written into the c= ommand queue buffer. type Command: FromBytes + AsBytes; =20 + /// Type of the reply expected from the GSP, or [`NoReply`] for async = commands. + type Reply; + /// Error type returned by [`CommandToGsp::init`]. type InitError; =20 @@ -604,7 +611,7 @@ fn send_single_command(&mut self, bar: &Bar0, comman= d: M) -> Result /// written to by its [`CommandToGsp::init_variable_payload`] method. /// /// Error codes returned by the command initializers are propagated as= -is. - pub(crate) fn send_command(&mut self, bar: &Bar0, command: M) -> Re= sult + fn send_command(&mut self, bar: &Bar0, command: M) -> Result where M: CommandToGsp, Error: From, @@ -626,6 +633,51 @@ pub(crate) fn send_command(&mut self, bar: &Bar0, c= ommand: M) -> Result Ok(()) } =20 + /// Sends `command` to the GSP and waits for the reply. + /// + /// # Errors + /// + /// - `ETIMEDOUT` if space does not become available to send the comma= nd, or if the reply is + /// not received within the timeout. + /// - `EIO` if the variable payload requested by the command has not b= een entirely + /// written to by its [`CommandToGsp::init_variable_payload`] method. + /// + /// Error codes returned by the command and reply initializers are pro= pagated as-is. + pub(crate) fn send_sync_command(&mut self, bar: &Bar0, command: M) = -> Result + where + M: CommandToGsp, + M::Reply: MessageFromGsp, + Error: From, + Error: From<::InitError>, + { + self.send_command(bar, command)?; + + loop { + match self.receive_msg::(Delta::from_secs(10)) { + Ok(reply) =3D> break Ok(reply), + Err(ERANGE) =3D> continue, + Err(e) =3D> break Err(e), + } + } + } + + /// Sends `command` to the GSP without waiting for a reply. + /// + /// # Errors + /// + /// - `ETIMEDOUT` if space does not become available within the timeou= t. + /// - `EIO` if the variable payload requested by the command has not b= een entirely + /// written to by its [`CommandToGsp::init_variable_payload`] method. + /// + /// Error codes returned by the command initializers are propagated as= -is. + pub(crate) fn send_async_command(&mut self, bar: &Bar0, command: M)= -> Result + where + M: CommandToGsp, + Error: From, + { + self.send_command(bar, command) + } + /// Wait for a message to become available on the message queue. /// /// This works purely at the transport layer and does not interpret or= validate the message diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index 1683ebb4c685..b42e32dcc55c 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -26,7 +26,8 @@ command_size, Cmdq, CommandToGsp, - MessageFromGsp, // + MessageFromGsp, + NoReply, // }, fw::{ commands::*, @@ -53,6 +54,7 @@ pub(crate) fn new(pdev: &'a pci::Device) -= > Self { impl<'a> CommandToGsp for SetSystemInfo<'a> { const FUNCTION: MsgFunction =3D MsgFunction::GspSetSystemInfo; type Command =3D GspSetSystemInfo; + type Reply =3D NoReply; type InitError =3D Error; =20 fn init(&self) -> impl Init { @@ -104,6 +106,7 @@ pub(crate) fn new() -> Self { impl CommandToGsp for SetRegistry { const FUNCTION: MsgFunction =3D MsgFunction::SetRegistry; type Command =3D PackedRegistryTable; + type Reply =3D NoReply; type InitError =3D Infallible; =20 fn init(&self) -> impl Init { @@ -183,6 +186,7 @@ pub(crate) fn wait_gsp_init_done(cmdq: &mut Cmdq) -> Re= sult { impl CommandToGsp for GetGspStaticInfo { const FUNCTION: MsgFunction =3D MsgFunction::GetGspStaticInfo; type Command =3D GspStaticConfigInfo; + type Reply =3D GetGspStaticInfoReply; type InitError =3D Infallible; =20 fn init(&self) -> impl Init { @@ -236,15 +240,7 @@ pub(crate) fn gpu_name(&self) -> core::result::Result<= &str, GpuNameError> { =20 /// Send the [`GetGspInfo`] command and awaits for its reply. pub(crate) fn get_gsp_info(cmdq: &mut Cmdq, bar: &Bar0) -> Result { - cmdq.send_command(bar, GetGspStaticInfo)?; - - loop { - match cmdq.receive_msg::(Delta::from_secs(5= )) { - Ok(info) =3D> return Ok(info), - Err(ERANGE) =3D> continue, - Err(e) =3D> return Err(e), - } - } + cmdq.send_sync_command(bar, GetGspStaticInfo) } =20 /// The `ContinuationRecord` command. @@ -262,6 +258,7 @@ pub(crate) fn new(data: &'a [u8]) -> Self { impl<'a> CommandToGsp for ContinuationRecord<'a> { const FUNCTION: MsgFunction =3D MsgFunction::ContinuationRecord; type Command =3D (); + type Reply =3D NoReply; type InitError =3D Infallible; =20 fn init(&self) -> impl Init { @@ -354,6 +351,7 @@ pub(crate) enum SplitCommand<'a, C: CommandToGsp> { impl<'a, C: CommandToGsp> CommandToGsp for SplitCommand<'a, C> { const FUNCTION: MsgFunction =3D C::FUNCTION; type Command =3D C::Command; + type Reply =3D C::Reply; type InitError =3D C::InitError; =20 fn init(&self) -> impl Init { @@ -410,6 +408,7 @@ fn new(len: usize) -> Result { impl CommandToGsp for TestPayload { const FUNCTION: MsgFunction =3D MsgFunction::Nop; type Command =3D (); + type Reply =3D NoReply; type InitError =3D Infallible; =20 fn init(&self) -> impl Init { --=20 2.53.0 From nobody Tue Apr 7 12:20:08 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013045.outbound.protection.outlook.com [40.93.196.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C973A3BFE2D; Wed, 25 Feb 2026 13:44:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.45 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772027045; cv=fail; b=QCjS05d4F9dzdAEdX+otu4PFmaNCBrHlDdnazVACxK79nJ8ft4CXNz7fGz4xX2Hjadj4gzKmvZFJJAzgxMQ4qYS5nDUNP1adtojCGLivhc2SEVrIL3rVzBFLISKZfshmE0UKbOuda6kJdV6MSFBJz3R0GgYK9w1OCMS1om/otf0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772027045; c=relaxed/simple; bh=asKtK1RxQGbRgaNcUU42CDXZCbvs/A7wGvtn7L7Rwag=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=gTFKrTVj2f92KxzXmFOmZxgS8rXv5rNUGfiCWeIdntpKDAEKHztkcRnq/lzfNPeRpcjRZONzlFT2Ijwo/dBosuBUV+FQpwyNrvPHiQv1aE7tHnXeBS3SyqWu7zpY0iZQpamfcYpy27QRDxiCgtcCa2RYxfeNpDu4Bk5UK4Q5soc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=XXU4SZVG; arc=fail smtp.client-ip=40.93.196.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="XXU4SZVG" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=U1UieSgDLpGK08RX9uFVd3RDo7YAJ1v+j1bpOYCFG7BIenfD7hGgGizWQYXRwaZNX4Gg+vkcchlpRF6yq6Y++WKluQBLxVVF1pogEAoYmpaeDUlJPye8xW3I7npCyIUuhrzveu7LcV1Y/Aoz0xD1oixxC2qkUHqu73TkKmAH1Oy2+L3cI8CjkZkvpBMoXvpBLuhPAHOZVFHmSHZkR0sqabn3xC4JTcvMAG+ncWeS65q114eTwUAclAJjzN3L7PyYrqmhV6a/1zG7/UMAsOv1OfuprJIFcTsI7RmWjUDf/3SvQ662BzF7dkXBRDMuSsA4rpxkpeNc3xvki0IQ99Chwg== 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=JyOoCY6pQvHIcgeQI1nGZ2ppXFcClJkbYkRBd/nLGk4=; b=lEd05dM/FMRD3YEYEmgsnzPkIjyl+DYSy8uSbZktLyucMUYpWC0R69J8Js6ml5X5WrFOJQcXVQ5QdzXFsBLUH6Kb1vDUYbIblntw+27iU3sFntjiw5C9jX0qEJ2oYPIO4hmPedphyQj8PLYwZfcM91Zj8e5CPKhew+plBM6LUb8ipbj9LtOQxr0i24IMe+gxVW/o/6FMKBye2mGi3VAMRsK7sznMeYKqlFnu235iffR6sNB483PHgTMvgW4VrTtPc551TkNAZq5GXasrjJYvukkUEsaf8yMHj7NVQ+V2C5ZIys5tPB8717lVZDzy7N8T/Ys9izWhWNYpbzvhoLp1Fw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=JyOoCY6pQvHIcgeQI1nGZ2ppXFcClJkbYkRBd/nLGk4=; b=XXU4SZVG8KIsh82QSInzeoHBBuyhuLD3POVpEIL/H8s9uq9DyLFJnB2Zam6Qmjh+ESM7EAiRZLJAHU6shFA3R7BIgkIh23fiutvcrEDxVnidXwC9/b5HUcIg8Xcw8Od/KxLKqfELvjMWBIFZEufE5MN8wT5IgxigIAaTpjY3F1k8Fvemg/jakPxfSsJiBtKsROkMK3qcLj9aavVRS+i2hJlX+blVyzJHB6G8bWqDCRUzx/jE4ygXruD2d96zdWs/QpDp0mQEZgBf0Dr2xSdUdxax2Dk2GfW6oLQdLhoF48mBqZGY6lp4J9AC0a9tVVNYJ6Nuq2iO65CmsI4gMw1adA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by PH0PR12MB5679.namprd12.prod.outlook.com (2603:10b6:510:14f::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.21; Wed, 25 Feb 2026 13:44:00 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%4]) with mapi id 15.20.9654.007; Wed, 25 Feb 2026 13:43:59 +0000 From: Eliot Courtney Date: Wed, 25 Feb 2026 22:41:50 +0900 Subject: [PATCH 3/4] gpu: nova-core: gsp: make `Cmdq` a pinned type Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260225-cmdq-locking-v1-3-bbf6b4156706@nvidia.com> References: <20260225-cmdq-locking-v1-0-bbf6b4156706@nvidia.com> In-Reply-To: <20260225-cmdq-locking-v1-0-bbf6b4156706@nvidia.com> To: Danilo Krummrich , Alice Ryhl , Alexandre Courbot , David Airlie , Simona Vetter , Benno Lossin , Gary Guo Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYCP286CA0158.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:383::9) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|PH0PR12MB5679:EE_ X-MS-Office365-Filtering-Correlation-Id: c84fb0e7-74cc-4713-1fb7-08de7473ee02 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: s4J0yuLlL4dSyvITSeIIMXd0KpPAZgy7COvJxzNlALs0nyuPGdBjaJsbjX/FOu+VsmCzZlpsvqHh61BiGkG9ANh0en5+J6lTO5JH6jCNHiuvEJ0/Kvsk/VVv0fzlZFy3M+LJE7lPwJtOs5uSMbIL0rJiuB/roP46Die3Gekzl7IT3sn43/B4w6YCZ0lln8JVHCB0JizabX4tZ44p0zQyPrmCXS/YfUTMv0KHT4035eIx/buCa0xM99ZYo84NhfvgrAKro0mPyZ+RYiEbAARNbUsr2SAD7TUb/lCHBn71B0+1GCaodaSN7ShjZ30ZPsosgCkUYENGCjKEu0LLNfseznztHw9AbFawaiqiGKQufOGgifvoCa2zaElRht8ltlf6MPAHJwhLeAKFYy7//MXouOKYw+fLLZCccM9+YSJD53SWglxN1/IWywkgO5xSNV8CDIm6IAwYMYb7396vRmNjKIfbgbv1ksheNyCQN2M+Gua8pLjto39iwyAKvuThwNzDNCyHoXjGV/WWG+C5kQ2oiGoYcn7+b/2cqzmzaDNfAS3FW8nyJQxYi9NuMlwv77pq7LSXb+aIctimWmlYC1WQVvxHFOosQ7rY9Hnj5phDDL7raU29HZdPrnbn9VLWUcs7QnD1OQG/ep6vhCESaaciGqWi5x3YCGl4RJFkBo9SH4w+uRsEEFU5+KJqw1nqiD7teWocvGqlvstJR86WllRQK86vQ5F9A7LyOtzs8CqpOsQ= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?K1cvc2VEbTU3RjJScWNrMUtyU2xCRkdPaDR3NDUvbXdnR2NjMDdlNFJ4VlBH?= =?utf-8?B?RVlxVGFTTysyMnpTdFZ1Wk91Z1A4TkgzQjQyMkJ0d1NJMFEwUEFmbGRFVlF1?= =?utf-8?B?ekdoUEVleThyMFBPZldYTSsyZUFqMlRZZ1NpekFYclZLTFZiSSsxdzYwT1dR?= =?utf-8?B?ZWFGbU5CanN2cnVVUW10WmhsRWxWT1VhQTNINVVpMmJoV0xKVlBqN2xiMEhU?= =?utf-8?B?MnVWVVBSU3pFd3VWQ0hoZ1VSSW1uMjB6N3h6U3ZKNzJWd2lwN0FvaVhldWFO?= =?utf-8?B?Y3llOU05WnZhb1BBRTRkb1BVMFpObUtPUlltcU9IUGFYZDMxeWtBN0Y1ZVZP?= =?utf-8?B?cVV6aDlTSHdQUS9lK01ZUHNPbURCSGJoL0l1NHY0N3Q2d0VKQkNtQm44Q25L?= =?utf-8?B?MzUvUWM3L1ArcWdBSTZoK2FGbXF3ZjhGMjBqYzRRZFdSVFZGd3RrNWY4STdY?= =?utf-8?B?U3ZKQk5TZWtQYmxKdVhDcXlFZksrcGE5RXoxQ3FiUGpqRVBQNGEzZWZJSFY1?= =?utf-8?B?UjU3VUlJc1NyKzdtVHFJYlFRWGdsWjc0bWNNVyt0N29FSkdZOTlOQU5pTGJW?= =?utf-8?B?KzB3QmJ5Q29aaTV3d1BmWksxU1A3VDZKVWJvYmJVTEhJY3BWbGRnU0J0Zzlq?= =?utf-8?B?dWtta200SHlqQm8yL0REWEdtZStnTHNBMGFNRkZTd1dZK2V3UGVXVXNGYWx3?= =?utf-8?B?ZGVHa0pvNWxEdEUrczM2WThDTXBLRk1DdEZDbjRobWlQMGNmNmwyQnM2TUdu?= =?utf-8?B?SFhCeFJFZGVwY24zRjkwQzcyc3gwSFlCdXU1T2tmS0lVcDE2R0lkRmNkS0kz?= =?utf-8?B?MWV2TWMzbGtrQWtaNEYySzlGZkJHUE44bTNNU0wyUFV3aTRzNkV4UFYxNlJE?= =?utf-8?B?RUxVNldQSEJnQStkUGFZQytWVVE1NkVWMU0zN0lrRCswcU1kYU9DR2IxRFVl?= =?utf-8?B?M05aU05lSEZ5SU5GMkZXVTU1WTdnTVVUVThDY1I0VnMvWVVFMllKaTE1bnpG?= =?utf-8?B?VmI0bHlHc2NoVERDWlBKckdnOXBFOWladEVRRlVxYk00R2ZYMUloRUJnclY0?= =?utf-8?B?YlhnSm1NcGJVNzJtb21xM1pGTlNWbkNZRVZSeTVkZ1BmbFpvTWpnMlFzNUhO?= =?utf-8?B?MXhoTzFGdmppVVNLSy9aTlFWV2lXNTF4YWx5ZlN2NDhMV2grellTb0lVaFpu?= =?utf-8?B?cjNnYktwMko2OENjSDM2blc2VXhlMjRYY0ZOWFU2UFNtdmtYeEQ1WTJibE1y?= =?utf-8?B?ZXFtU1dTS1JOZFYrQ1hYQlNSU1lRYmlGY0N6THUrVU00d3dMNDBjZXVEMWt6?= =?utf-8?B?WnBZTDNVRlVNbEI0YmNwSWtWVnYrQ1l4aUVnR2JnbmxhMStkcWxyRks1RTZ0?= =?utf-8?B?MUhPVUJDQ3Y1Yml5WDdvMDVmczNTVVZYWXU4WEtMc0Y0VUZ4QXNkc2hQOVBI?= =?utf-8?B?ZE9vWXVrWC9HSUNzL2xJS0daRVJtMVlDRzJZWUZXeCtUZkRETEZtd2lGUnlD?= =?utf-8?B?NG1wblZHdGFwaDMrUjhhNHhYeDdwdUZQUlp1Z29IWXRhL2JXVXl5eStRQkor?= =?utf-8?B?U1RJTzNuRXJ4U1pMY2dxUjBZMTlZdGEvVlh0Tk1tMStGRmoxN0xSaEhZL004?= =?utf-8?B?YVhxSjZES0FhUTE3UXFwb1E1eEl5T210RGZMZE0yeHBYNzJjUVlFdlRiMEpv?= =?utf-8?B?aWJwVXlBcllHQlhaeHgyZ1cyb1gyM204Slg3RTN6VnhBWnlvT0RaQUxUOU9p?= =?utf-8?B?ZmRiU0dsVGtKSU9GbVpVcVRsclFRZlFCa3lYUXlocWdBc29oak5HUWp2MDY2?= =?utf-8?B?TVJySStEZSt3T010TmVyQTU4Vmx6SDdpL1RiUnNXWUVzK1BzWERVS0pYV1Rq?= =?utf-8?B?c2hpcHdZaGhaS2x0MG1pS3JvVGRGZDZWaU1qUHpZVnF6MlFMdGlRQjVlcUdB?= =?utf-8?B?YzRRWDlnTFBveE95YytsdyswaXczcFBudEdpckhLQ2wwV29Kd09mZERCWVJC?= =?utf-8?B?ajRwV0J4ODhtVXVkS3p2aVBrZW54di9rYno2dVp6MU1VTWhGeVlRelA2U08y?= =?utf-8?B?dksySGhiczJNbmtUY09wNzBoQmJKTU9ZVVhJUjI1RXFRWFlMNlM3eU1KcHNi?= =?utf-8?B?NGNQRVVjaGwrYjRFclVmNEpsQkZ2NkpkNUt3K1A0dS9yMTZ0bnpnUk5WTndI?= =?utf-8?B?WmJpVkF1RHJBbEdWVnNtM3hiZHM0OEQyQzFxOTFmVlRnUVpOWXdZUXZQYWhl?= =?utf-8?B?UnZjUHhrQ0RIVDhTZlJNaU1FVC9vVHo0Y3RZa2QyVjdKL3lWRU1ZNDJmTkl4?= =?utf-8?B?TVdVK3dVQVlUVVRraGYxNy9HQXZqVGFZZldvL1ZSMXY3eWk1ZWZFS2ZsaHIr?= =?utf-8?Q?Bbx8Tk4q0ckX2yfzuva0FZIYmdR7caa4YHPutveZycHGe?= X-MS-Exchange-AntiSpam-MessageData-1: uaPs2kXU7dDgBw== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: c84fb0e7-74cc-4713-1fb7-08de7473ee02 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 13:43:59.9458 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: zwLFNIeRLNNVNzBzkD1Bkcp/y4Zk+rtTvQStStbErwiG9dUKq6xvuu8zu1JrQIqD1XHOqkB/2NrpM78HtdZ3jg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB5679 Make `Cmdq` a pinned type. This is needed to use Mutex, which is needed to add locking to `Cmdq`. Signed-off-by: Eliot Courtney Reviewed-by: Zhi Wang --- drivers/gpu/nova-core/gsp.rs | 5 +++-- drivers/gpu/nova-core/gsp/cmdq.rs | 9 ++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index 174feaca0a6b..a6f3918c20b1 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -112,6 +112,7 @@ pub(crate) struct Gsp { /// RM log buffer. logrm: LogBuffer, /// Command queue. + #[pin] pub(crate) cmdq: Cmdq, /// RM arguments. rmargs: CoherentAllocation, @@ -132,7 +133,7 @@ pub(crate) fn new(pdev: &pci::Device) ->= impl PinInit::alloc_co= herent( dev, 1, @@ -149,7 +150,7 @@ pub(crate) fn new(pdev: &pci::Device) ->= impl PinInit(command: &M) -> usize /// /// Provides the ability to send commands and receive messages from the GS= P using a shared memory /// area. +#[pin_data] pub(crate) struct Cmdq { /// Device this command queue belongs to. dev: ARef, @@ -501,13 +502,11 @@ impl Cmdq { pub(crate) const NUM_PTES: usize =3D size_of::() >> GSP_PAGE_S= HIFT; =20 /// Creates a new command queue for `dev`. - pub(crate) fn new(dev: &device::Device) -> Result= { - let gsp_mem =3D DmaGspMem::new(dev)?; - - Ok(Cmdq { + pub(crate) fn new(dev: &device::Device) -> impl PinInit= + '_ { + try_pin_init!(Self { + gsp_mem: DmaGspMem::new(dev)?, dev: dev.into(), seq: 0, - gsp_mem, }) } =20 --=20 2.53.0 From nobody Tue Apr 7 12:20:08 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012030.outbound.protection.outlook.com [52.101.48.30]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DE9483BFE5B; Wed, 25 Feb 2026 13:44:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.30 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772027050; cv=fail; b=kyNVTojsfGeLZFMWopDGUB8bo+8EEL1anXW+qVbbxb1nuiBk5xNrLCEj0Q7tlETobWXPVhhVKTWC3LIC8NHSlOv6GfSDkZuCCHMW7CoYS0DrWJEWJafIZGHUJFRxwXe3bGrpbdvhiIGliT/SrbgGxk+vGWXiJvOwk0Fl3QDIeeo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772027050; c=relaxed/simple; bh=MSHGdszObUHhu5VEmf2kRp7bKD+Gjzog249dMs77eNE=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=ePUVJl1J1hUGK4dv+5mIc7hoej1uRSHwVKsyLWXvFTtR0O3f5mm9HInrq5LRLon0l6PAs5OBDLDZAJ7vUHyMOUVmoofVsr5N3k1mSrE/TbMkf51FtqrShJ2Upt1OGFTmjtQTzeRjaiL62rFHhqTcSv0Lw+d7/teCVxFcCjfrqCg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com; spf=fail smtp.mailfrom=nvidia.com; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b=uCgEx+wF; arc=fail smtp.client-ip=52.101.48.30 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="uCgEx+wF" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=RN7QgWSsoxR3bNS1B9cw50gYLyDAVEK+vS4APWgzjvv5Qz+0X8TXn9xyqkgSFSYeD5PWnP0zGPdsEfxYFwt9gmT4WWlVcnbs3g90bAckpWNe883SUBElKLrmH8nbTOzwuNIYplxtjEy9WgAj4wCg7JtaAmHZLHkBBKKPn64HYfncw09dO/EUfOIa/kkX2PxfuW6WkVdPiI1gZv7sx6pN5HlL7TgAkRf3A5r5RPYhx5X8bYzINkfJl2ETQ7EFhLL5knVpmNofh4TIng2y4pBnIdJOhnXENJF7L1GJML43lLFEj0Sc47wURAFafY4e/5Zpdf/XH32xewFDOnZlHu4EMg== 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=U7861W4/oTqYbUnw0uSAoE2LmjwwfQADAyHQCI8LxPM=; b=Q+4FG6skohVqJOsXUZ81qVMGXBHKFC4VsMXPTs7kk2QKfUjAtjziPgq/9zQL8ziKcMG6YXzlrqC9xGyRuiRhalJRUjRMtAHHrMrcwQJyrbiRdOD8WNCEgVkLJoKuWDc8Y1O0Vmj0g/Aj5UFO3Ea8Yys4ZQA6RzgZ+cRWHcoGGCchHkade9MAeTC2ZBrKVx21/XbxewIWCMAkoXDZ06DpcAxYyzdQYmYcORkOb8WxLWE4iLRSoJum/d7U4wu7mYu4mjA6c/Obw5zTQ/fVtVG3P0ItqqDU49fj1PBCqmN0cjbg/WGxyFxdlQTWx9CcH4PN9/sC1TdzU4df5Va+XrtwHQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=U7861W4/oTqYbUnw0uSAoE2LmjwwfQADAyHQCI8LxPM=; b=uCgEx+wFzSWU+m9QtmOP9QJnDySH/1a5y2AUCzUoRnygqkMH5+nzownyEI4XetrKavBoCIeiGQIX2lPpAMJ8As+SDkx2TRFgeVQcQ0TIwuSdUkGrqA2NVTK1I0zueW6uRPPRHugGrEatnEmi6E9ba3zTGcPj+kYBwm5BSVkiP0mWrDPUl4ERtKq7A0PIow0W/Lt89oCoZGEhFVwW6SBdbhZBuRKHo+W0+VJemEnNSug/YoaWM80UtECXoIcbwUx4GKSmSDjeMLlSUAZJ8p5kZErJUdtWfGTZwY2+zvhy+LxDxUCfQEiB1Ls29ddIkvv5QqRLKCcU8vbMmywdA3+8WA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) by PH0PR12MB5679.namprd12.prod.outlook.com (2603:10b6:510:14f::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9632.21; Wed, 25 Feb 2026 13:44:04 +0000 Received: from BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0]) by BL0PR12MB2353.namprd12.prod.outlook.com ([fe80::99b:dcff:8d6d:78e0%4]) with mapi id 15.20.9654.007; Wed, 25 Feb 2026 13:44:03 +0000 From: Eliot Courtney Date: Wed, 25 Feb 2026 22:41:51 +0900 Subject: [PATCH 4/4] gpu: nova-core: gsp: add mutex locking to Cmdq Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260225-cmdq-locking-v1-4-bbf6b4156706@nvidia.com> References: <20260225-cmdq-locking-v1-0-bbf6b4156706@nvidia.com> In-Reply-To: <20260225-cmdq-locking-v1-0-bbf6b4156706@nvidia.com> To: Danilo Krummrich , Alice Ryhl , Alexandre Courbot , David Airlie , Simona Vetter , Benno Lossin , Gary Guo Cc: nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org, Eliot Courtney X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYCP286CA0157.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:383::12) To BL0PR12MB2353.namprd12.prod.outlook.com (2603:10b6:207:4c::31) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BL0PR12MB2353:EE_|PH0PR12MB5679:EE_ X-MS-Office365-Filtering-Correlation-Id: d5366c8e-8567-41bd-7692-08de7473f078 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|10070799003|376014|7416014|366016|1800799024; X-Microsoft-Antispam-Message-Info: UrplHgYriks7cCQNStLqZZ6sJdqgZ3ybg6HTjopOw6z4H+zIRHzF6Yn1EpzX3lG3fKSgs85vzqGziTYSXL/DJgi9+eRqxYX+14JzqK09O7Qhjwl2eGcTgePZ3uV946U8hImsMNfWXyluoZUw1q0cycabwmsEtKyENbR4jt3XHQkALWgAUMnW+uSm4BFbFbgP5148JvxyZ9wKvXDLRv1YZCzErUSS2K8TE02/pwDI8dYV5nBtfMx+CXlecqjU9+TSwepBuC5XUdUUONns70ThiVvZ3S4j+JcPCePPRor/sA+/CKzUW3H2eov+mJy/NjH9ShvN7sO6W154oTGXb9L2/Qn94pw6M+ZCZ+FnkErS4W4JSZag5LDlo9HWm9bNQi2FoUdpLLAwjzO8gJ5kydSYOLl6+noYNqzvDVXEkaP4DfqyBxViFdRfnfw5ihcnQyx0Irp+Q5W7c76v6TY4G70Aq/MwCPUWiro05UhruhDUPWisw9pTrOjLh1BSIjaYDlz06ALWK4e55Jjqc3xRNgbgs01tHRE8WhrV+hC92eKXRzPfVRxc+/Vx5IpXTeV96hP4nqwOFHP36GTU5hsIRd5RnN3olqnhUrIAyaMUSC4WEx4xZ8G6ooWK6gmGzFDGzEu1CNnjy7RQ/xTediLxWZ+vofYgJEj2RAWkUSQ85dBuH92My1Y616ONnTKyOVKKj8wmzIdk1xcL12CSbqK6kl6y+4Xg7q7pO9zRMd/AEfJSq/w= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:BL0PR12MB2353.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(10070799003)(376014)(7416014)(366016)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?VTg1Rmo0WGNQRTNSamlvdnhXMzMvb3pQRGVtTDNrTXpVWFdnK1paNGltSVJa?= =?utf-8?B?cEE1TmtBQkFvMWpNRlJzWUtzY05UYUg1R1cyaUhwRWZXYkorUmRSTXI1c2pR?= =?utf-8?B?WW5XYXE0TjgrUVdxaVlmcjI1TFNXc2hOTmZIOUR6R25tMFU2SENWMENORWlr?= =?utf-8?B?ZEg3MFB1RERobGo4aG42QlZKMG56c1prM25kRXhZTEJ5MC9iWjRpOUtrTG5u?= =?utf-8?B?clF1NE9DNm1CSmhlYjdOTmJ5UENMdE8ycXBGdy9FWjJ4S0c4dzhZYXRvN2lS?= =?utf-8?B?T3JDS25keHYvamcvOHhvZW92T3pDQVVkV0RuZHVWeUxrc0xIQmhhWCtFanJ5?= =?utf-8?B?NTRTSEdQYjZVeENHbXNFSHhuR2ZWc2pYQ0RjeTV1Q0FoTTdqMmgrRUZKb1VK?= =?utf-8?B?QStEOU1DNW1hNzdRc3NnUUNhQWdMSWl5VFdXbjBJQTJQS0tVL1ZJKzJUR3VQ?= =?utf-8?B?WS9zdHVERlFMUEdleG0xYnJJb3JrY3l4RmxYWk9tZ1Zsd0p0aWFvSnYvVUhD?= =?utf-8?B?YTQvaGlPVGp5WU15MEhmV0lVRllVRXY0QmVlVlpzUnVucUlmUGxuVDVtU1hQ?= =?utf-8?B?S0QrbG51ajJaRUlBa2NNL3J6ZU1uUmtkMHIyMWtFVlNKWlhhdUNjcXZOMjBK?= =?utf-8?B?UkRsSUFQWHBrdmNzV0F3WWgyTkd6OGp6TTVnc2NLS3h1L0M3b2lqSXpxbm1w?= =?utf-8?B?ZEluYlJYdnhMQi94ME1OVHVMOXg3Tkh4azFXektGZ2w0NVNNcDgxWjRnV1RI?= =?utf-8?B?dUMyRXZHOER4WEhHd25oTGpNeTVEejIzSUc5cmdaTXZqUjliQitnUGpGV3Q3?= =?utf-8?B?enV4V0l0MWQzcGF2ZVB0THhkZTZuMmcxMDlxL1QrY2thR3YzZGNhRWhOU3VD?= =?utf-8?B?ZFdnRGlCMzhFNWJFOTFCMlFQNElnM2w0Y2dNYndQZmxndEdvTVRHbGJWNVBt?= =?utf-8?B?Ylh1SUkzQ2VBQ1lVQVkyUEZncWxoN2ZHUU0rQ1dpWFgxUTJmaHZ1SDZlSy9W?= =?utf-8?B?UjlxZmg2clpwTlZEM25mcUQ5MUxxYkhHcWJTU0RESVRlMWRqbGNkcURJb01l?= =?utf-8?B?SEJRSmExazFUZzByV2xGcnJWSTU3anpuenZBTjFrTy9DSStSbDZkVVJqOC9N?= =?utf-8?B?ODE2TDh5VVF2SUtYQUpzY0RiODRtdDVmNGVDTkpWdlRkSUhPWW1vYTBGMjN1?= =?utf-8?B?bCtTSGJxeDluWlNhb0g3RXdrRzh2cnFadS9vSVpLUStlRENwMjZGMk9Ec0My?= =?utf-8?B?ZElFMk8wSWVSRzB4cEtqQWUxMDNJWGZYUWlUVHF1cEJWUURETGVobmZXS3dO?= =?utf-8?B?aThkQVF4V01mUjRzbHFINFFJMWJjY2RreENCN2Z4bm16WmZGc1RFclR3UzRu?= =?utf-8?B?TDJCanhMdUNpdy8xa1gwbCtpNFdkUmw3WUJiWE0xVFJIRXZFOURZSEREQjNn?= =?utf-8?B?djkrd3JuQ0dVMkFRck0wODJETWR5bXUxRWhmSGJSL1NTL3VYTFcvRnNrZm1Y?= =?utf-8?B?eUdCUGRDb3FpVWptb1JxcGx0ZXpWTXBianVaMU9YZE1GVE9md0VLNkVuWEhs?= =?utf-8?B?THJyWWNESlJheTZsWi8zM0dGd3J0eXhmTmpma1FiQUtnNUxZS3psandYVkxZ?= =?utf-8?B?ZUtrWEd2SVBxNFNkSWg3QTg0WWFRb3kxMk1XVWFXYXJIaHk2WE15TXlXdzBB?= =?utf-8?B?VEliYzhvak53cUZES1lLU09IdjlZSHNqWC9lbytVQjRNTVlIMnROK2Q4Mzkx?= =?utf-8?B?L0FrS2hOZGg4SEp1cEl6aHJubTJkdnJaei82NXFVNHFhMW93am53VVBKSDNJ?= =?utf-8?B?ZE54QVBVeGNwamJybTB0U2srcHBEZXdBcEpmRXIybi9scnpCc2w3dW5Xd3E5?= =?utf-8?B?cHVWTnRGRG5tRXh0UTd2a0hteHJlSGtzRHJpSWtOTDBKcjlYRGw1bDU5MGVr?= =?utf-8?B?eFZWaURMT2s0TmpnZ0ZnQkEwNmsrOElOdXBNOXpNTTN3dWd5aXhlMVBRalFv?= =?utf-8?B?eHdBSU05U3VXK1JGYjZEOFJKTE5IWG1lQkFJM0hYMFFIREZlMW5taENNcUtB?= =?utf-8?B?WkNTMmZsZnZWS1FDVGtlOUl3ak5vbzV4OTJKOXQ5c0dKVzBybm5OVkhDai9y?= =?utf-8?B?TXZMcEtiR2h1SUF6dFZuNHlBZi9abHNOcHROelZOeTFYZzZLWEQxazhZZjRV?= =?utf-8?B?R2ZWZkRncTFxenB2L3pQbi9LVDFsMlVZN3B1ZlFNSkQyeUE5YkQrQWxDemxi?= =?utf-8?B?eGp6T1UyUmRuaFYzM1Y2TmJ5TkRkY1FiZndMZmJyaDNhS3ZjZlNhYTZ4amI0?= =?utf-8?B?aEMyc25nT3BxdEJSYVg2Nm50MzB1aWV1Q1pRNGROeDdHODI1djdIMmplbnlo?= =?utf-8?Q?vrsWanMXPkXrmtf7bWc+SWx7shXJKXmtjXyqRCXCTxjBb?= X-MS-Exchange-AntiSpam-MessageData-1: 4rz+0ou3HjsEgQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d5366c8e-8567-41bd-7692-08de7473f078 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 25 Feb 2026 13:44:03.9096 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: PicIMznWTgkvWBag1THo/J4ULY3RfohLOeBDkDeiA28TmYbKNagy3H2n34DctcbZOtNqTKW3hWSJ1UbHIlAh6w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR12MB5679 Wrap `Cmdq`'s mutable state in a new struct `CmdqInner` and wrap that in a Mutex. This lets `Cmdq` methods take &self instead of &mut self, which lets required commands be sent e.g. while unloading the driver. The mutex is held over both send and receive in `send_sync_command` to make sure that it doesn't get the reply of some other command that could have been sent just beforehand. Signed-off-by: Eliot Courtney Reviewed-by: Zhi Wang --- drivers/gpu/nova-core/gsp/boot.rs | 8 +- drivers/gpu/nova-core/gsp/cmdq.rs | 260 ++++++++++++++++++-----------= ---- drivers/gpu/nova-core/gsp/commands.rs | 4 +- drivers/gpu/nova-core/gsp/sequencer.rs | 2 +- 4 files changed, 152 insertions(+), 122 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index 1cb21da855b9..cb583f57666a 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -128,7 +128,7 @@ fn run_fwsec_frts( /// /// Upon return, the GSP is up and running, and its runtime object giv= en as return value. pub(crate) fn boot( - mut self: Pin<&mut Self>, + self: Pin<&mut Self>, pdev: &pci::Device, bar: &Bar0, chipset: Chipset, @@ -232,13 +232,13 @@ pub(crate) fn boot( dev: pdev.as_ref().into(), bar, }; - GspSequencer::run(&mut self.cmdq, seq_params)?; + GspSequencer::run(&self.cmdq, seq_params)?; =20 // Wait until GSP is fully initialized. - commands::wait_gsp_init_done(&mut self.cmdq)?; + commands::wait_gsp_init_done(&self.cmdq)?; =20 // Obtain and display basic GPU information. - let info =3D commands::get_gsp_info(&mut self.cmdq, bar)?; + let info =3D commands::get_gsp_info(&self.cmdq, bar)?; match info.gpu_name() { Ok(name) =3D> dev_info!(pdev.as_ref(), "GPU name: {}\n", name), Err(e) =3D> dev_warn!(pdev.as_ref(), "GPU name unavailable: {:= ?}\n", e), diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 44c3e960c965..faf1e9d5072b 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -16,8 +16,12 @@ }, dma_write, io::poll::read_poll_timeout, + new_mutex, prelude::*, - sync::aref::ARef, + sync::{ + aref::ARef, + Mutex, // + }, time::Delta, transmute::{ AsBytes, @@ -54,8 +58,8 @@ =20 /// Trait implemented by types representing a command to send to the GSP. /// -/// The main purpose of this trait is to provide [`Cmdq::send_command`] wi= th the information it -/// needs to send a given command. +/// The main purpose of this trait is to provide [`Cmdq`] with the informa= tion it needs to send +/// a given command. /// /// [`CommandToGsp::init`] in particular is responsible for initializing t= he command directly /// into the space reserved for it in the command queue buffer. @@ -470,66 +474,15 @@ pub(crate) fn command_size(command: &M) -> usize size_of::() + command.variable_payload_len() } =20 -/// GSP command queue. -/// -/// Provides the ability to send commands and receive messages from the GS= P using a shared memory -/// area. -#[pin_data] -pub(crate) struct Cmdq { - /// Device this command queue belongs to. - dev: ARef, +/// Inner mutex protected state of [`Cmdq`]. +struct CmdqInner { /// Current command sequence number. seq: u32, /// Memory area shared with the GSP for communicating commands and mes= sages. gsp_mem: DmaGspMem, } =20 -impl Cmdq { - /// Offset of the data after the PTEs. - const POST_PTE_OFFSET: usize =3D core::mem::offset_of!(GspMem, cpuq); - - /// Offset of command queue ring buffer. - pub(crate) const CMDQ_OFFSET: usize =3D core::mem::offset_of!(GspMem, = cpuq) - + core::mem::offset_of!(Msgq, msgq) - - Self::POST_PTE_OFFSET; - - /// Offset of message queue ring buffer. - pub(crate) const STATQ_OFFSET: usize =3D core::mem::offset_of!(GspMem,= gspq) - + core::mem::offset_of!(Msgq, msgq) - - Self::POST_PTE_OFFSET; - - /// Number of page table entries for the GSP shared region. - pub(crate) const NUM_PTES: usize =3D size_of::() >> GSP_PAGE_S= HIFT; - - /// Creates a new command queue for `dev`. - pub(crate) fn new(dev: &device::Device) -> impl PinInit= + '_ { - try_pin_init!(Self { - gsp_mem: DmaGspMem::new(dev)?, - dev: dev.into(), - seq: 0, - }) - } - - /// Computes the checksum for the message pointed to by `it`. - /// - /// A message is made of several parts, so `it` is an iterator over by= te slices representing - /// these parts. - fn calculate_checksum>(it: T) -> u32 { - let sum64 =3D it - .enumerate() - .map(|(idx, byte)| (((idx % 8) * 8) as u32, byte)) - .fold(0, |acc, (rol, byte)| acc ^ u64::from(byte).rotate_left(= rol)); - - ((sum64 >> 32) as u32) ^ (sum64 as u32) - } - - /// Notifies the GSP that we have updated the command queue pointers. - fn notify_gsp(bar: &Bar0) { - regs::NV_PGSP_QUEUE_HEAD::default() - .set_address(0) - .write(bar); - } - +impl CmdqInner { /// Sends `command` to the GSP, without splitting it. /// /// # Errors @@ -540,7 +493,7 @@ fn notify_gsp(bar: &Bar0) { /// written to by its [`CommandToGsp::init_variable_payload`] method. /// /// Error codes returned by the command initializers are propagated as= -is. - fn send_single_command(&mut self, bar: &Bar0, command: M) -> Result + fn send_single_command(&mut self, dev: &device::Device, bar: &Bar0,= command: M) -> Result where M: CommandToGsp, // This allows all error types, including `Infallible`, to be used= for `M::InitError`. @@ -583,7 +536,7 @@ fn send_single_command(&mut self, bar: &Bar0, comman= d: M) -> Result ]))); =20 dev_dbg!( - &self.dev, + dev, "GSP RPC: send: seq# {}, function=3D{}, length=3D0x{:x}\n", self.seq, M::FUNCTION, @@ -610,73 +563,27 @@ fn send_single_command(&mut self, bar: &Bar0, comm= and: M) -> Result /// written to by its [`CommandToGsp::init_variable_payload`] method. /// /// Error codes returned by the command initializers are propagated as= -is. - fn send_command(&mut self, bar: &Bar0, command: M) -> Result + fn send_command(&mut self, dev: &device::Device, bar: &Bar0, comman= d: M) -> Result where M: CommandToGsp, Error: From, { let mut state =3D SplitState::new(&command)?; - - self.send_single_command(bar, state.command(command))?; + self.send_single_command(dev, bar, state.command(command))?; =20 while let Some(continuation) =3D state.next_continuation_record() { dev_dbg!( - &self.dev, + dev, "GSP RPC: send continuation: size=3D0x{:x}\n", command_size(&continuation), ); // Turbofish needed because the compiler cannot infer M here. - self.send_single_command::>(bar, contin= uation)?; + self.send_single_command::>(dev, bar, c= ontinuation)?; } =20 Ok(()) } =20 - /// Sends `command` to the GSP and waits for the reply. - /// - /// # Errors - /// - /// - `ETIMEDOUT` if space does not become available to send the comma= nd, or if the reply is - /// not received within the timeout. - /// - `EIO` if the variable payload requested by the command has not b= een entirely - /// written to by its [`CommandToGsp::init_variable_payload`] method. - /// - /// Error codes returned by the command and reply initializers are pro= pagated as-is. - pub(crate) fn send_sync_command(&mut self, bar: &Bar0, command: M) = -> Result - where - M: CommandToGsp, - M::Reply: MessageFromGsp, - Error: From, - Error: From<::InitError>, - { - self.send_command(bar, command)?; - - loop { - match self.receive_msg::(Delta::from_secs(10)) { - Ok(reply) =3D> break Ok(reply), - Err(ERANGE) =3D> continue, - Err(e) =3D> break Err(e), - } - } - } - - /// Sends `command` to the GSP without waiting for a reply. - /// - /// # Errors - /// - /// - `ETIMEDOUT` if space does not become available within the timeou= t. - /// - `EIO` if the variable payload requested by the command has not b= een entirely - /// written to by its [`CommandToGsp::init_variable_payload`] method. - /// - /// Error codes returned by the command initializers are propagated as= -is. - pub(crate) fn send_async_command(&mut self, bar: &Bar0, command: M)= -> Result - where - M: CommandToGsp, - Error: From, - { - self.send_command(bar, command) - } - /// Wait for a message to become available on the message queue. /// /// This works purely at the transport layer and does not interpret or= validate the message @@ -695,7 +602,7 @@ pub(crate) fn send_async_command(&mut self, bar: &Ba= r0, command: M) -> Result /// message queue. /// /// Error codes returned by the message constructor are propagated as-= is. - fn wait_for_msg(&self, timeout: Delta) -> Result> { + fn wait_for_msg(&self, dev: &device::Device, timeout: Delta) -> Result= > { // Wait for a message to arrive from the GSP. let (slice_1, slice_2) =3D read_poll_timeout( || Ok(self.gsp_mem.driver_read_area()), @@ -712,7 +619,7 @@ fn wait_for_msg(&self, timeout: Delta) -> Result> { let (header, slice_1) =3D GspMsgElement::from_bytes_prefix(slice_1= ).ok_or(EIO)?; =20 dev_dbg!( - self.dev, + dev, "GSP RPC: receive: seq# {}, function=3D{:?}, length=3D0x{:x}\n= ", header.sequence(), header.function(), @@ -747,7 +654,7 @@ fn wait_for_msg(&self, timeout: Delta) -> Result> { ])) !=3D 0 { dev_err!( - self.dev, + dev, "GSP RPC: receive: Call {} - bad checksum\n", header.sequence() ); @@ -776,12 +683,12 @@ fn wait_for_msg(&self, timeout: Delta) -> Result> { /// - `ERANGE` if the message had a recognized but non-matching functi= on code. /// /// Error codes returned by [`MessageFromGsp::read`] are propagated as= -is. - pub(crate) fn receive_msg(&mut self, timeout: Delta= ) -> Result + fn receive_msg(&mut self, dev: &device::Device, tim= eout: Delta) -> Result where // This allows all error types, including `Infallible`, to be used= for `M::InitError`. Error: From, { - let message =3D self.wait_for_msg(timeout)?; + let message =3D self.wait_for_msg(dev, timeout)?; let function =3D message.header.function().map_err(|_| EINVAL)?; =20 // Extract the message. Store the result as we want to advance the= read pointer even in @@ -802,9 +709,132 @@ pub(crate) fn receive_msg(&mut sel= f, timeout: Delta) -> Resul =20 result } +} + +/// GSP command queue. +/// +/// Provides the ability to send commands and receive messages from the GS= P using a shared memory +/// area. +#[pin_data] +pub(crate) struct Cmdq { + /// Device this command queue belongs to. + dev: ARef, + /// Inner mutex-protected state. + #[pin] + inner: Mutex, +} + +impl Cmdq { + /// Offset of the data after the PTEs. + const POST_PTE_OFFSET: usize =3D core::mem::offset_of!(GspMem, cpuq); + + /// Offset of command queue ring buffer. + pub(crate) const CMDQ_OFFSET: usize =3D core::mem::offset_of!(GspMem, = cpuq) + + core::mem::offset_of!(Msgq, msgq) + - Self::POST_PTE_OFFSET; + + /// Offset of message queue ring buffer. + pub(crate) const STATQ_OFFSET: usize =3D core::mem::offset_of!(GspMem,= gspq) + + core::mem::offset_of!(Msgq, msgq) + - Self::POST_PTE_OFFSET; + + /// Number of page table entries for the GSP shared region. + pub(crate) const NUM_PTES: usize =3D size_of::() >> GSP_PAGE_S= HIFT; + + /// Creates a new command queue for `dev`. + pub(crate) fn new(dev: &device::Device) -> impl PinInit= + '_ { + try_pin_init!(Self { + inner <- new_mutex!(CmdqInner { + gsp_mem: DmaGspMem::new(dev)?, + seq: 0, + }), + dev: dev.into(), + }) + } + + /// Computes the checksum for the message pointed to by `it`. + /// + /// A message is made of several parts, so `it` is an iterator over by= te slices representing + /// these parts. + fn calculate_checksum>(it: T) -> u32 { + let sum64 =3D it + .enumerate() + .map(|(idx, byte)| (((idx % 8) * 8) as u32, byte)) + .fold(0, |acc, (rol, byte)| acc ^ u64::from(byte).rotate_left(= rol)); + + ((sum64 >> 32) as u32) ^ (sum64 as u32) + } + + /// Notifies the GSP that we have updated the command queue pointers. + fn notify_gsp(bar: &Bar0) { + regs::NV_PGSP_QUEUE_HEAD::default() + .set_address(0) + .write(bar); + } + + /// Sends `command` to the GSP and waits for the reply. + /// + /// The mutex is held for the entire send+receive cycle to ensure that= no other command can + /// be interleaved. Messages with non-matching function codes are sile= ntly consumed until the + /// expected reply arrives. + /// + /// # Errors + /// + /// - `ETIMEDOUT` if space does not become available to send the comma= nd, or if the reply is + /// not received within the timeout. + /// - `EIO` if the variable payload requested by the command has not b= een entirely + /// written to by its [`CommandToGsp::init_variable_payload`] method. + /// + /// Error codes returned by the command and reply initializers are pro= pagated as-is. + pub(crate) fn send_sync_command(&self, bar: &Bar0, command: M) -> R= esult + where + M: CommandToGsp, + M::Reply: MessageFromGsp, + Error: From, + Error: From<::InitError>, + { + let mut inner =3D self.inner.lock(); + inner.send_command(&self.dev, bar, command)?; + + loop { + match inner.receive_msg::(&self.dev, Delta::from_sec= s(10)) { + Ok(reply) =3D> break Ok(reply), + Err(ERANGE) =3D> continue, + Err(e) =3D> break Err(e), + } + } + } + + /// Sends `command` to the GSP without waiting for a reply. + /// + /// # Errors + /// + /// - `ETIMEDOUT` if space does not become available within the timeou= t. + /// - `EIO` if the variable payload requested by the command has not b= een entirely + /// written to by its [`CommandToGsp::init_variable_payload`] method. + /// + /// Error codes returned by the command initializers are propagated as= -is. + pub(crate) fn send_async_command(&self, bar: &Bar0, command: M) -> = Result + where + M: CommandToGsp, + Error: From, + { + self.inner.lock().send_command(&self.dev, bar, command) + } + + /// Receive a message from the GSP. + /// + /// See [`CmdqInner::receive_msg`] for details. + pub(crate) fn receive_msg(&self, timeout: Delta) ->= Result + where + // This allows all error types, including `Infallible`, to be used= for `M::InitError`. + Error: From, + { + self.inner.lock().receive_msg(&self.dev, timeout) + } =20 /// Returns the DMA handle of the command queue's shared memory region. pub(crate) fn dma_handle(&self) -> DmaAddress { - self.gsp_mem.0.dma_handle() + self.inner.lock().gsp_mem.0.dma_handle() } } diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index b42e32dcc55c..7ceff2e6bd63 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -170,7 +170,7 @@ fn read( } =20 /// Waits for GSP initialization to complete. -pub(crate) fn wait_gsp_init_done(cmdq: &mut Cmdq) -> Result { +pub(crate) fn wait_gsp_init_done(cmdq: &Cmdq) -> Result { loop { match cmdq.receive_msg::(Delta::from_secs(10)) { Ok(_) =3D> break Ok(()), @@ -239,7 +239,7 @@ pub(crate) fn gpu_name(&self) -> core::result::Result<&= str, GpuNameError> { } =20 /// Send the [`GetGspInfo`] command and awaits for its reply. -pub(crate) fn get_gsp_info(cmdq: &mut Cmdq, bar: &Bar0) -> Result { +pub(crate) fn get_gsp_info(cmdq: &Cmdq, bar: &Bar0) -> Result { cmdq.send_sync_command(bar, GetGspStaticInfo) } =20 diff --git a/drivers/gpu/nova-core/gsp/sequencer.rs b/drivers/gpu/nova-core= /gsp/sequencer.rs index 2fa2a0792cec..bc94b8567c6a 100644 --- a/drivers/gpu/nova-core/gsp/sequencer.rs +++ b/drivers/gpu/nova-core/gsp/sequencer.rs @@ -366,7 +366,7 @@ pub(crate) struct GspSequencerParams<'a> { } =20 impl<'a> GspSequencer<'a> { - pub(crate) fn run(cmdq: &mut Cmdq, params: GspSequencerParams<'a>) -> = Result { + pub(crate) fn run(cmdq: &Cmdq, params: GspSequencerParams<'a>) -> Resu= lt { let seq_info =3D loop { match cmdq.receive_msg::(Delta::from_secs(10)) { Ok(seq_info) =3D> break seq_info, --=20 2.53.0