From nobody Thu Apr 16 17:32:54 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012010.outbound.protection.outlook.com [52.101.43.10]) (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 0B4B13D902A; Thu, 26 Feb 2026 14:54:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.10 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772117659; cv=fail; b=OCPiUZJgAlOtZsDm1C3K9FrcnYSaXJJHa4VL+y5TErOXtspZW7ub39yiXddmYeUUk/oUYyOOqRz0LfrwX8yPCkXorSEyAqbPRKFlpofZL3X0yQ7r08CUBJQVH+iBLAcgp1OZtWMejTiaP9wOYspeivMgWItMkeHSyLWnuBjJoXg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772117659; c=relaxed/simple; bh=5kFGaIxYemFYw4By1C8jG0gTexpy4XWptSVLW8uKqXU=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=SeyS0HywwWHB1+lwb/2VQZLE2CZY+NnJhwBZus676Cxe9EuY6URlYXkUu7lrk28PU0kIJs8zL6CYw03HD/NK7sw2+4C52iJB0/wK8kmtpzChVRpUpv4DkIR28nzpVlppf+/GAy1AMEnaxi2KNGExPus7S+yG3LBTcWwMTKyMlQc= 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=rLCqjhOi; arc=fail smtp.client-ip=52.101.43.10 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="rLCqjhOi" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=EMFXxjNv4T/fLWlPnDH2XblGjHcHVaywiymHxLJOcAzlLQ0RT1H7ZyNS6BaIzidmIwVsANq2iplZvD/a0P10/Y5vMzPFV7KIrOf7A9oUfCO9a/q8XGxEhTng/oSj7PktpIMZaIpzk78OebewrqR5/wPBlLbVpKpvENzJiXpbqQsdLM/dvqfGDzksprsUWgvDPYE/H7zs9/Lo7VloCwL3dELP5/FlTRiN6s/H7+j7TCheatIOHfi4+xoKT4cCzrW9QBLqK9tM8NUB39W8cS1XYNXmhOTbuSTQudOJCHB1vhLl+g0Wl04FZqzuloDF1tjtJIfkpOjKU1KHLF2hyaLChA== 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=borvlHPInA96NUX7XQ8bnPxo/6AqXuP8VbhNgdfHfpM=; b=qW8nweTiBg3H/mD0+VLG2tr2IpQD2UPlHi4OHCXMqjewlCdqc9NhSgoFM6Qn4BSP+9QSaQXGD0eW1/n5qKA4FWdM7LwptEKoxi7TqujwQqy3sskQFVsSGwfvK8Czr+zaxaBgEGy7zVICJSIwpjluYnBim2kkiXuV/0xFCl954ju/AsQREKKh+OQvy8l8seTQodxwqw4SkYRSYlpk98LlOnk3cTI8FVNv0bDHjbFYXlJpcB/PGkK6eSeTy44eTqJ164Kqr9297eaJyW4VyAy7qi4IKk7ibzEsxlqYKu17hBMMx4rw4XYojexlMWq3sUZTPJ6F3RN9Vfh6qPHC3vbHGg== 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=borvlHPInA96NUX7XQ8bnPxo/6AqXuP8VbhNgdfHfpM=; b=rLCqjhOivC+0e+sPqUElrZ785k0nJgEv5MErVHolMXaXNPK3NwTWFF5Ccd/BeXYhUI89VFx9B+l+KGW5EF51AlFQPzlfVL4Z6Y7//bQUKRyBsPekQNzi+RgAoXBVtjC0zjIuRJDPagtWG6pJRIVhJ+WpXzErZhu7k9dx8irCckllQ/ZCd+x25d8mvZw7mjtiPHu8Mk7C/hIbc4bl7Ba9IIyrVdQMlrCtU2RcZHMa5V7IlKoiYbnnbkQqjcP1jL7x/dDaVNBdp2D6alByBmqfdC9G6/EiuUaXnTpPUUWNTLdYBmPrHT+Pk2HWwhohDN1t9K8qwzUMLn/G8XHC/slFWg== 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 BY5PR12MB4066.namprd12.prod.outlook.com (2603:10b6:a03:207::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.15; Thu, 26 Feb 2026 14:54:15 +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; Thu, 26 Feb 2026 14:54:15 +0000 From: Eliot Courtney Date: Thu, 26 Feb 2026 23:50:23 +0900 Subject: [PATCH v2 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: <20260226-cmdq-locking-v2-1-c7e16a6d5885@nvidia.com> References: <20260226-cmdq-locking-v2-0-c7e16a6d5885@nvidia.com> In-Reply-To: <20260226-cmdq-locking-v2-0-c7e16a6d5885@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 , Zhi Wang X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY1PR01CA0184.jpnprd01.prod.outlook.com (2603:1096:403::14) 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_|BY5PR12MB4066:EE_ X-MS-Office365-Filtering-Correlation-Id: 93702d85-f0bd-4893-ab58-08de7546e93e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|10070799003|366016|7416014|1800799024; X-Microsoft-Antispam-Message-Info: 89OEKOtQ2Qv4kXYQq4KEeLfVsz5s+baqw0iS/xERtqoAsHUFdzqCLnlVgZ7/vHFxg4bFiMKwOPW7IWctvwaRhbI0AKHFjHz2HwWtcOs6kK3BAYNCqNoUB6GFPaX6ZpArgC/h/BmmuJ5LhUKunY3KTB+Cpqnl0+ktvcq0jDZe01lfmOaca9ysR7sucH9UkTT1jusXu9yIbZvYP/auZSaAQ2c+1iNRZsG3VuShoEW/tg7YuPjusdgt7DOyQ9jkwV4FrzyyPZFy1LXfoUJWC8zuQ8FDVlNp2BbA9uCbdpkPnbCTk2Asga+CQnMDNKvhYYK/A++rRMx84a9nQoY4aw+M8c7uGaScV0pKnDE5YWdcxkQgekOXVdtu9cOD6KvMMRS4CKt2GQlaOQUyQsg8eiiX3Agy2s/Db5UhpUctp8wrLQznPLzXLcWsWKIR9afKf7qpDma+VHXShs4CJI5x6ESZtHN9Qs4s02B18X3tIIcjl1d6Qh4tpDFquhVQai1s6Ar8umVwJmrwFougErCcoxCGQQFegNHTKt7NxA3SkhKRWsh+n7NZwy5e7xYA1XdC7rsth4OO7EIPaqFdSCnN1lEW3kJpJ1Mj2Ore4nTAQz05aVf5KqISupEv+OBT21YBZxPbcLnx/QtKjhXZdA7tvdE26p8Isur+K3rKxVYBR5MT52FLZaR+YlL4Gn6adCKb6l5qOPVxRVXg1FM5EXZFj3qHxe7CPFgC/scXs/0hYnmDteE= 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)(376014)(10070799003)(366016)(7416014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?Q2xsVC9SMmZtTWhFR2NUZjNwbmtacEk5bFJDaWZFeWJuNUdneU5IMlhQREth?= =?utf-8?B?VkZJTkg3ZU5BdGJrOFJFMk1EN2psbDEwZWp2YkxQRVhic2d1c0hIODRMa1Nr?= =?utf-8?B?Y0FWaVVzaXBkUUJDayttS1oyakVWM202TU9vQ1k5cUw1RjE3QTY3b2diWG5U?= =?utf-8?B?NkpNSnJORmgraXkvcmkyWjRJdVBWRnRxMTFacDJoRGZ1MW1ablppQnRCeU1a?= =?utf-8?B?ZkhraXZscCtuOTRqc1piRmdLWWE0b0V5UE0rMWJ1bFNuak1reGRVVDRZN3Bp?= =?utf-8?B?SnR2T0JQemZOdnhpMEZKczR4NGQ5MFhLOUhEVU4relpLaElTWVBBZGFUT3hP?= =?utf-8?B?RGRxUGpDdENQM0RlN25tNUtQOE9ZemdJeXlULzJYbVN0VUtocFRPUkxSQjhW?= =?utf-8?B?UHIwTm92Q0JuOGpSWVhFNXhSVkppSzVhRitOSmFpM1h5c042TjlyY2hWYnMv?= =?utf-8?B?NHhleTEvallOdmRBZURMZWsxR3dZbXVaY3Q0WTJXcm5EUm1tSDFUTzh3em1E?= =?utf-8?B?b2V5czhOeG51c1JKY28xQzEveUFNaVNnQXUzemhWNGc0a1ZabUtvZmltZlZq?= =?utf-8?B?eituamh6eDFaU3c0b2orQmJsU2l3STBWM2VrbitTNlRnVDByUkNkTndyYW1l?= =?utf-8?B?UkZPOTYyQlJEYUFQdWFtSUc4bnFOdGpJaVRreWNINjdXcUtpQWVSNlY3c01R?= =?utf-8?B?bGt3UVp0c0VFTWFoRWNxbjlSZFl1cXI4bkpnREhReUpnQ015WlFvOGZlcmoy?= =?utf-8?B?YmFmdy8zRG9IY1lXbitkRjdYNFFQNURCY2ZFQkdVbmF4YlVqWWhXMGJPUVJo?= =?utf-8?B?bURJN2UzMlFNMUJoSUwvbktlNHp5b1F6RmtKTGFkeTFBRXZDZE1JYnJOMmd2?= =?utf-8?B?VW9HcG56NDIyWEE3Q2RzZXhCY00rKzJlV0xkZjBCdDc1MDV6d01hZkxMYnlz?= =?utf-8?B?NG9zdmp0UTNid0x3QjlGUEdwNk5WTmkrbVlFaFVGK1hrMlM3aXVWUk5RRG5j?= =?utf-8?B?MnFDTUJYMnVEQkg4dEljTGI1cnY0OUZTOGhrRVBvVFZhU0xtL2haaFJoVUkw?= =?utf-8?B?MzVEMjN3K1VmclFKVnFDWDRsOEhOVUM3QTVlMEhEM1ZTTFVhTnN1cldrSTB1?= =?utf-8?B?SXlpV2R4SXllR1V5RVYxZXFDYjZzSnFLekN4MzUwYnZWWkVTNUVqQWVpM3lN?= =?utf-8?B?OEdZRGc2VVZXUDdvaU9WQkoxR1dDSk5kN3pVTllkQ2s3Tm9pK0xaRGtmYVRR?= =?utf-8?B?MFAzZkovb3l3em1qWE5GdmdYaFNlSWdoRTB6YTdYTTBJRWlUeHg0enRCb2Z6?= =?utf-8?B?c2JHVnFZL3JPcWdtalFwZjJpdDFGVG1CdTFRMW5VMHhEZ292M1VJUGNEZnI1?= =?utf-8?B?SXMxRTN5K3hvbmpvTnNHUXdqRW1ZMlkweTkrUTZoWWltWkFkMGdDM1lWVGwy?= =?utf-8?B?eFB0bzhJdERSVlVnNjZGYS94ME10R0g5Mnc4U3NNQU9IeVZnVHZ3NDlaQVJx?= =?utf-8?B?Q01lb2tPY3pHUENnZVlFaFhXZjJZTVFINU5aV28vVlNYSXNSc0V2YWxPbVVN?= =?utf-8?B?YkJXYm9RbkRVSSsvWDkybnRhL0twOTJnK3RmaDN1N3pURkQ1QU5FVndzVTQ3?= =?utf-8?B?R2s1Y2NXd2xaQm1FTzRmYU9MK0YzdkZLZSsxekN2RXhidnRiNS9LUklJQU9V?= =?utf-8?B?MzBBNU9NUEgrdFdZYUhKUFlFVlF1MW9tVFpsUDdSS2hEbXczcjNxRUNlOGZM?= =?utf-8?B?Vm96Sk5wSVNaZWx5bS9sbFN3VzdESWl2U0RJL09xK3FsdlpHcHBiWndscTFE?= =?utf-8?B?SWxmMjVTZHdZSE05SHBRUjNRNXRCRHQvOE9aQjVTNDlKMng4QUx1VDJjcWNY?= =?utf-8?B?YmVSbXB3OXVmRjdEcmx5R2E5TzRhQldZU2ZVZnR3alFMc0Y3RHpaRlZHYlRs?= =?utf-8?B?MEIvWE5ueWtVZ1JBd0tmdVBUejlyM3J1ajJNY3FpSGFGb002SUNrLzU3WTBN?= =?utf-8?B?aGFuRUlCZEtqVkdyK0VjWUhiNWI1Ni9pQVR5T2hYaS9uU0NFUFBwd0E1Q05Z?= =?utf-8?B?R2lOWW15VHAyc0tqV1hraFozWW9DNkFuQnU4WlpUQ3hJanZhZ0I0SW5lcDFz?= =?utf-8?B?dWsrd3dsSUE1OFJBc0N4cjE4bW1wbE14Z1c1R2NXeUR1dWRXZnM1MHZ5TytW?= =?utf-8?B?Ty91ck1LSUxkZ1hlbUNPaHBxQUk4eFVXandVN1EzOEk3UFlIdWhScWwzZUVH?= =?utf-8?B?eGowRm1GblcwQ3ordDJ4Wm4zTTh0YldQZElOWkNNSjFxOHp2eFdVMFpaUlds?= =?utf-8?B?ekZBeklqbWVYZ0U0K3FiQXVvVXVVSG5HaXQ0UkxiaUhkMmxmeUlZcTlCemFu?= =?utf-8?Q?NBlPiCjbtZ+qg7qiq4TwOPgUCaUxHX8wCshsbEVotH9HW?= X-MS-Exchange-AntiSpam-MessageData-1: qAHkandTfBIQPA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 93702d85-f0bd-4893-ab58-08de7546e93e X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Feb 2026 14:54:15.5354 (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: ufGt/ZRmmi/kV8nhA+knetTfyw+hgkORXYJ/RL2oEilw7mEz22xVfsDrEOdx4tXX11gcj8z2PWs3YPi/YF3pwg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4066 Fix some inaccuracies / old doc comments. Reviewed-by: Zhi Wang Signed-off-by: Eliot Courtney Tested-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 d68b93ddf7cc..a3e039117120 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 Thu Apr 16 17:32:54 2026 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010016.outbound.protection.outlook.com [52.101.46.16]) (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 AD2E53E8C66; Thu, 26 Feb 2026 14:54:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772117665; cv=fail; b=pKtdLXw/iP3QhMaLLCa8au3o+BkCtd13gs/ZwniGFoGwfvvIFUX5CdvABLW6kDhDozkRE9t+Yb7dbFFc98iPS+ssu4PQPaF1v08WU8VpYGW/FO1ATGdqh8rY/Po+R7aowybOk+GhF8Ay4/qNX+UMMJSHNvXePxyTz43VxprZPRk= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772117665; c=relaxed/simple; bh=fiQq393zYwD+8Irc4O4WXUD/TMQdEZTAxCizlMsUR3U=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=M4+ZVj1kBBN5dm0TViz9BAFjR3v/gGvTK+nYDiVah0eUFMHM3P9s9j3+1XEMpK6UzE/XCSMVge+BY8XBCJfSl5T8l2rjnOzxHRYol76E6AwYba+7NCT/B8/gRauET6N1Q9bD6pc5RPQwg6mOxwytogH5o2PRO9mQ2e8N4Sbh3XQ= 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=pwtEgjzp; arc=fail smtp.client-ip=52.101.46.16 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="pwtEgjzp" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ti34ejNJzbxybprbs2JU3MbfhmC0f8Nk04Q/EuFFzKmCerk6pxL/r6lX9f0czkutz+Ds66C5zF0UfKCIOA+yYXpjR+NtA6AzZQ3Hi7sGX+VwDqBaVMX5m6SCr+0k+ertwghlDImqH2IGFElYESZK5jCl1agUBEc1xFWgDxY4uN9GqVxxAAc8324NHIEBM16ZrCMBWBuAqSpP1kIUTdyHLwuRRp7bm63dN0WfWwvMZ0zbLdTIdW+4XPzPK04j6PbJnvqQ6NsreK7nWnCiXH52RX/Dao5VXT5G9H6LWm1gI4Bkba3ocJ1aHi4JsxJsx/qd6Aw0V4rlNwrwqeQNkWXlMQ== 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=Xt4Osgdah9SijIzLsYtn6RjjhLQGf2V7KNqzfiZwMrQ=; b=Yv75c14qS0c5NflxE1H+HPqoF2FXdVaqpchdtMHzJvPLwk7Le1NVn4HvXuXNIWlNM8luhc3iev6kttUvw2qDXmYeEIi9VHVWFcZWYUQ1cpmXl5vIBxOdfkTcpU3XnIVA2xeIjNRlz2JUKklz7GwAAH/r8ajBvLFNMFHHvZcQkGXeCpnaOTP+U0X38fSOP7mHxG++D2vIDb8/uA/0RhE16fVcegCP3zqoo8DWbMNolMMD8rsfqflsxGycQTCaePBk6LrhDY/9lm9m2TTAlUZTS9Fqa7bkYXPpErcNkBoqAseGD39rldiFWdvHEzSeBFC2+zjAXAJrOCBVrAVULtk5cA== 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=Xt4Osgdah9SijIzLsYtn6RjjhLQGf2V7KNqzfiZwMrQ=; b=pwtEgjzpZuKbIGTEfFrhiR660YlZeggfH+ISOMnLQRo2+5MK3Woy+glqxJniju3kFd1tjwcMUd/gFik0Vbr7dyb/OX2h9SIFCX+Y32isxIBSSYbElxj/XfHW+mqoQvDvWmt6oosXwWIpboQR7rRbUFOYciAbFBM5SGE9RaMLAiMa+++7ULEcYTI505jXspDLS3FIWNISBLGkuykhfwwiKSGFQC8NK0xponbrwxdHvLIQgjt+Wlhb/QHHAQI7xTaGpHnDfjQAapOgjuQtFYAG3jbzEt8PDFqtGvmnWgBNoHfv7mGjAw3cbYB5ZwP3JACWffAIqAkkqIW6va6BHapHSQ== 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 BY5PR12MB4066.namprd12.prod.outlook.com (2603:10b6:a03:207::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.15; Thu, 26 Feb 2026 14:54:19 +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; Thu, 26 Feb 2026 14:54:19 +0000 From: Eliot Courtney Date: Thu, 26 Feb 2026 23:50:24 +0900 Subject: [PATCH v2 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: <20260226-cmdq-locking-v2-2-c7e16a6d5885@nvidia.com> References: <20260226-cmdq-locking-v2-0-c7e16a6d5885@nvidia.com> In-Reply-To: <20260226-cmdq-locking-v2-0-c7e16a6d5885@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: TYCP286CA0127.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:2b6::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_|BY5PR12MB4066:EE_ X-MS-Office365-Filtering-Correlation-Id: 36d2566e-764d-4ced-48df-08de7546eb9a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|10070799003|366016|7416014|1800799024; X-Microsoft-Antispam-Message-Info: NA8+3VCiuaLoYazm+VYt4iU+gU6GbIaFX5ZHclCnKgBZGssff/ZyQr8wr49Zou6NPoDy0tE7aby/gIozhtYXFBK9fTBgm0Z8K9wE7Lq6+vfdZIPQze8X+nAlVYbTvJGdoFuPyzLjYzYIKXQBZ5W0Jigf4Zdqxt8AfDXDuAraruIJaMLIX61HdVVb5uOivtCz4d4E25P6HF+js4kmiLr+4YtD0CVzXJ8KOvKc++EGup4jAjsL1Vi1CIZbxe6WrKfxvqnn2hs0SXnSlN41lo8IJ8hHXa0HpKmMUqfKZExClGHn4HMZn/x0U7xz3WRZNaQ0+ySSSOgYUt3xYBT//tkmtQ0slxxWPUI/EfHJGYkhoV+gy1CZkgpdtYXWGLzV4WUOA+Kpap6vSxGzcUx4PhWD/lZeX7CDVUApVJo7JhpjyQ+XK7525yk7tulhWGgG3PNYNXCrhGwcIdi1goyT04u7wbCt3JN7pTO5f0PVmNMVDkFvjVPJ0aIPdxJLgnFYtOHuhkU4g9RYqZWtpHD/X47ziesCGHF8NOpiRZQIqIMRHo/I3VCc63o8rE2YQtih6XOSeai5nxz+APK3ZJl8HKq/7h75f79cc+gPaFCA3XJckr6aQFd+d6C5LGJUVOR6H/1UzieOc26EnWfDl7XpR4PIF7q8VUp43c7Bf3znLz9CeOdC1yLIQFf+tA2kfDBDNwbp7pCSxyDDXR6ughbBlKzIR0pa7Zu2iD5EBvt5Go0vZVE= 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)(376014)(10070799003)(366016)(7416014)(1800799024);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RUprd2V3aW1Rd2d5N2NpdmdHNThBZnlxTnowcUNacmFabjVrV0o3djJWeFFH?= =?utf-8?B?a3QwK0V0c01zb0wvbTZTVEpjTEluZmlxYVhkRThDZmhWRHJsbTBpeFhYT3FJ?= =?utf-8?B?ai91N0dWWFAxRCtyc1NmeEFYWHBCbGVzRWpHekMwN1laRnFTZ0c5UnpIZlBa?= =?utf-8?B?T3NIeFFqcmFySnMwY1FwZDRuSm83emVVclZGRkNCQ1hFU3BHYzhseTQvUHov?= =?utf-8?B?T3I0UDVYTW1nNkd1SHo3eDJYQ2FlMHI4aWM2dklIakhIS0lRV3EvQ0NPOExw?= =?utf-8?B?eGtLZ3ZRN0wxbUlzNHAzejB1WUVsbFZDYjRURlRlWGdPRjRidXJPaW9RSUlT?= =?utf-8?B?enA5czdXWmdrQW1jSWw2MTdXOFFiQkdPaWptQnBVZTRabGRQS3o3T3QzQy9v?= =?utf-8?B?ckFtMGhKMVcrdklnWTVLMXI2c1JmVHB2ZDR4UkhhNThIQlM3dlJ4eUxWelFy?= =?utf-8?B?c3JmMW5iVWR3UmhGbFlIbzJtZmJmaWdlaU16aXZmZ2tvSnFwd1FXTElQUTJr?= =?utf-8?B?UGF4VDBBR200SWZQeEtlcDkyYVE4TElYV0RSZTAyOTJKT0pnWG1tUGRtbDZL?= =?utf-8?B?eTJ6TVRJbERGMG5yNC93TTI1eWZFazRreE9kQVU2TzZXekJXRVpzNFBEdzZk?= =?utf-8?B?RzR4NWUxcFBtZ3VLTkxqSlJNMDQ2Sldnejg3RERubDUxVnIwZHdEYzlTNEMy?= =?utf-8?B?c3lRYW8rMXRGWG13aTZpYlZmMzN5a1NvWGhqQUcxN2Q0VDVJckdQZVlnS2ZX?= =?utf-8?B?MG4vcGhYK212OWZNd2Q4M1F6cHJBTDRCeXRkaE5JSE5SVTJOWnR0NlJKbFJ4?= =?utf-8?B?U0RvSzcxdVpXR2VLZDlYVGxXcU1nenFWeVNHKzJMcHllc25XbXVUSDlxKzB5?= =?utf-8?B?bnhzOGVVYTY1VDZsYzl1blo4bExCaTJHOFZTbkpHaGVmckhpT2dORFZJeUhD?= =?utf-8?B?RU1qS25IMlVWU1RnSy93SFN3L3VHbzdUQVNPWkpqbFV4bHdMbkh3RWIvTWpQ?= =?utf-8?B?UXNkc1lqR1MvVldyZjdYNVpabDI5UXYySFU4b3QzTHIrTmQ2Zk83TlhoVk9E?= =?utf-8?B?aHlLZGJpTXlkZGg5bDlsTy9pdGxPN0dDWDdRaGtONVRuTWVKM2JPYW5lTG9l?= =?utf-8?B?Y0J2S0xJc3hVWVVka05LZ2pNNEZMbUl5c2x1TnVDUC9oWExtNW1Md2dwSC9P?= =?utf-8?B?QlY2TkpsZnI2MHVwSUN6dUNBMEpSdXhiUTZQdGV5a01Ca0tRK2xjdm54Vjdo?= =?utf-8?B?dlJPMFVYYnluUDU5ckpHUGR6VUpqTnNCdVIyQng3TStLd3VCS0t0eHBRYmdm?= =?utf-8?B?eEx5QnRsUWdyOStCSWh4VjJSZmhQN2YvUUVOQlh4TVgvSnlMZ3RIQUZibjVk?= =?utf-8?B?SEpYNm1uR3ZOOE9xcmc0L1JJTmVmMmNCWUF0RmNpNWhnakduMFdVVXhKdWhK?= =?utf-8?B?MXRnWjNQem94c3FNckRodVVUWVl5Rmh2bzRtRk9PUFd4Yjk5QUhjZm1haVcw?= =?utf-8?B?UHcrQ2c0b2wvQndtcmFHVCtTWWM2QzArZUw2ajJRc1lUeExxYlJEWXdTL0ov?= =?utf-8?B?Vk95ZlVad3l5YTIxZkY5NkNXdS9YeTdHWlh6cExmUW0wYnpmVEw1YnkzRG8v?= =?utf-8?B?TGZ0eGhyM3JUMjhNclJmR3NqMEw2OCtoU2c4VTFlVS9tK1NLc2FrWGlJaTFq?= =?utf-8?B?NHdpSHVaRWJBTkZ2T0hjeVpxRVdUUnd6NVVNRDBSdENDa1BWR3FvRFg3czRh?= =?utf-8?B?T3N0OEtyZW5zVUg4azNjWHAxRGhhcjcycFpFRG1JVWNudkd1NjRPRjdVQzBt?= =?utf-8?B?NWhucTJ0bzRsSjBmS3pGZDQ3ZUZJblBkQ2VSbDVLZVNoQ2oySkdwYzlFYy8r?= =?utf-8?B?MlozczNUTUM5OFBRajlpbDkvNXpUQy9iRjc1c1c0K2lnaUxsY1dhRm9vQ1Br?= =?utf-8?B?dmJ6U2EzdFpWanlQK2JSTWl1MzJHalBZak9XOWdJOFFPY250RHlJZjlKSFRl?= =?utf-8?B?UEZhNUEzcm5KeDFnbEhoakNkMSt3YllNOXhMYUtJRlltZThYeHV2eEtOZ1JS?= =?utf-8?B?bWhUVG1XT2V2WDZoRnY1eG1GM3EyVWFNTEM0Wkd1a2grZlpFdmVkMWJqb0xn?= =?utf-8?B?bFAyY3R3Y0drTUxYcjZ0WEVmd0MzVU1sSEdVTXJ1NmpOd1h1UGtpdElxaWxG?= =?utf-8?B?b3Y4M1RFcGo4SnNSeFFuWDhrekxWZ2pXRnc4Rit3SXVRTU4yMzFCK0luN0FV?= =?utf-8?B?M01FRit3eHVHMG9QRnRKNGRtVldLcXNlK21yckdFbGdOVDJIYUFPbnJmZkN3?= =?utf-8?B?RUMzaHVobFlWS0ZENGtvNHVuU0J2aWdhd0kvQjZ0OEtkcjZpTVk2K21KMkta?= =?utf-8?Q?s/ucNrlaA+VGHSifDNa6Nq6e26IzDRPLg3YQBwnowUDhM?= X-MS-Exchange-AntiSpam-MessageData-1: Kbc5M/p0iAiEKQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 36d2566e-764d-4ced-48df-08de7546eb9a X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Feb 2026 14:54:19.5414 (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: +Aa5/lZ4HPSKAj0ISSW73a7rmOxhuBZqCOgbMMDX7j5FZOyXG4F6uBubXr5S9B4qFwecoQD6ijcrFdByfBiNmw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY5PR12MB4066 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 Tested-by: Zhi Wang --- 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 c56029f444cb..55899eba75db 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 a3e039117120..daf3e1d153d4 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 74f875755e53..47ca31611927 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 { @@ -356,6 +353,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 { @@ -412,6 +410,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 Thu Apr 16 17:32:54 2026 Received: from BN1PR04CU002.outbound.protection.outlook.com (mail-eastus2azon11010054.outbound.protection.outlook.com [52.101.56.54]) (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 E9C383D648A; Thu, 26 Feb 2026 14:54:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.56.54 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772117670; cv=fail; b=gMrvrV2sIq7xGrfIXEfyySMo6ibnCkYefGIXpvTq4vwyMsniXV8RpP1G4h97DcuUb4BqHt4CojUqhg/8iPWcCvVBI1t4jRoW5r2cM8RlM00iElHkJMI8EM1+NHM5mnvOHBsXzVV3UGhsITV6FbsZsggirSLkTuzfmtxvsCitawY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772117670; c=relaxed/simple; bh=0RhoE2Gc3QDzvS73OaKkuCKMuvBFHG0deRdRq/DPEww=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=IrTOC11F2EOCuYg5BPsauWb21CRDQZuN/s6jNHBtNtaDJTsHsL/ZfvFDGEekon+ejNgLaP9evdOCHTANCmfM+tsDAnlIHwweZ+rCXMk5k/n1mxrey2NalcLZAK3jMgdMGxsrNBnJH30SqEG79W1YM9J09GiaBceKSi0oVxlkcXk= 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=rQGmVYff; arc=fail smtp.client-ip=52.101.56.54 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="rQGmVYff" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=CqXcLsDSZPIn1b+O0xbQwqmm3hVLWxtphMVhD/SxawCDIpSvuusZnO/cP2Yq5+QFAHMgwIz0jplpTRM9C/s7Q9rp6R4uu9/9VF/Im6xlKH9wOF1TyC7GVTD9uLIfrVJXJWxv3dwHGQyev2aqlnAEjtqHPGzkkc3WHF4Tg7fL1/OwAfNPZowEC6eC0Vd4/bJZoQbCHBP5Lojgo2ehlb2zK8Y+nbyg7HJK+M3vQRFNffqi8OAdGzmPTsAA7pY5J9zN1TZ3Q2mGV6txS9oW7UxO3Ro5oH/XQvJbdzIKF5FnLNGv4MU09AfXovPq/Rbw4uR0yboyRvhLHgzUFfKQ/55E9Q== 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=JgdlOc7JbkMdaAeMKZFOUy2YKFh9Ylh3YPw/aVFqQjY=; b=Ieo5gBvHCb80bTv61406ETS18whF4RDscmULULkNgemqYBeDpN7F4u9pt+UM3jyjk2mMAYUlCsjEFQCL6qf/fn1bkKbvRpZvlJkxEiyTlaIPNGU53QKQISitbMPb0LWFFu8ACAAC3VjZfrAiQ0UsXtzPkZqwVkK/uV9SClM28a4QZfClDU9AbsoMKi46NAxT2uvkQNgU8QBpQ8U9XZUEXpHtaJlXPNDeUMSvU5J3PEFq9EiZ5XmRkQRp1O2WnTUDa8PbAh8qVbSGx3+lEgFODP035fEV7j6oo/07uiUwONLzz/BbOPAg68tRD9IZCPKHTmX3+iEc+T2llQ1GRUX8fQ== 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=JgdlOc7JbkMdaAeMKZFOUy2YKFh9Ylh3YPw/aVFqQjY=; b=rQGmVYff3MeV+3hF2MFTmxWz9z/uIOP7tLsZtutyqE8AlgZDQt2+BELlN0Fm1aHmqup2RcQysaNRYN6w/3wDdNl+vYPROUrD1SFoeaj7auSo64b1uJCJGvdxsJGKc1tQY56XiLzwMml2Mz2MOgdYnRv4b1wponTjS7y6aJdMi/yI6OXUmfuIFWMUVWDU2nBakYEaV2hlNIT314sXrco5u9bL+skecnHEII6wy8CaifMMQBL8pakY32PlM6LjP36xaY3mdQqPBdtmKksWwksVGTfXwRSmnAI0GXs0BFP4UYpAxwVBF67dwmTb1VpBSET7ctxoMEq8qlv+t9kzLmtBUQ== 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 CH1PR12MB9598.namprd12.prod.outlook.com (2603:10b6:610:2ae::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.14; Thu, 26 Feb 2026 14:54:23 +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; Thu, 26 Feb 2026 14:54:23 +0000 From: Eliot Courtney Date: Thu, 26 Feb 2026 23:50:25 +0900 Subject: [PATCH v2 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: <20260226-cmdq-locking-v2-3-c7e16a6d5885@nvidia.com> References: <20260226-cmdq-locking-v2-0-c7e16a6d5885@nvidia.com> In-Reply-To: <20260226-cmdq-locking-v2-0-c7e16a6d5885@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 , Zhi Wang X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYWP286CA0007.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:178::15) 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_|CH1PR12MB9598:EE_ X-MS-Office365-Filtering-Correlation-Id: 4d41d634-d094-4f29-ab18-08de7546ee2b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016; X-Microsoft-Antispam-Message-Info: Y6htxSd+HEySKcgBnM+dRrdvFZ5QWDAonx7wdDdTRZDelsTVyKZu3jIckhtFhksDjU/3ArC9o5n2rGrNrOOzgs6EZFwyfTytrwUMeabCwo5fT/4GhACluqgFJTJuHDgcxkWOj0y7CReScX6Y4F3RqUlckjKFSGz9quG0ilI1xVrF4XV15xkpDDfVb/5qmE5ZvYZYksuBHEBLjaa+C8Zn0VyVvZC80qNr79I4Ss79uPg+qz3nmTehJ4kzPESeC9h6qALvba6ZNCJZHlBU2o7f7Dy+IahtHUNSTGgbdbVSXE2MzYJ7lcuA8yJDo19DbKq98NwsTE+fAOV8E3jCj0GylI3LFtR/pwd6gi19/OKaZ3H3sNXK8UFaVl5Afxy3l3j+8RK/GMixzDMArqEbU/pjH9kQqkbJaIXlvS4Qs97Jv+QEDBpCamFM3kbxROCXg+5GjrZzjt6jMIj4YnkQ8Gbt9nr9+4Y7qu8GONcrFH6wvKfAWyOVAnIyrGtJiYTXCwR4e69dVCfKTAYiMEPwIrvN+sI7v/h83bfHPwGWNphUKXk2mLu3fHfhjmyIj4MrkXzP64olS996KtxDkkapNXlxxrRs0Wx2m83oES6M8Rs35LyTrliq+Fcze7qgfYj7e7XZh249SCwiIGEZzJMncVT1FPDwK3IgnYlN8g6pIv7/7XPJbK1OZUNJ4UneLmom6keFwbX2ho/K+Wk5hPcGOAUIaV2wM3DRl+/5poZoD0CrPyw= 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)(7416014)(376014)(1800799024)(10070799003)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?TCs2K1FQYTlmazN0WG5vNlM0ZFp5UkJtdEdBSGE2dTF5WFR0SU9PemVPWVoy?= =?utf-8?B?U25NU2VNY1JHMk9LeE04clhuT0dBMkVzY0xYcmNTQUxTb3dXYmFYcWdCK1Ax?= =?utf-8?B?dGNGRnNCNm05cGVQbWVmeTJ4bjZDZUN5b2M1MndhdlNWQXU2THpWQUQ4L1Bq?= =?utf-8?B?SWtBcVNPMGYyUnMwSVczcWhvNm5IZHV4VzdVaDBSWU9DQ1dZTVFDK3AzM1gx?= =?utf-8?B?UjJzYm9oTXU2ZjlqL3dyWVl0U0FhWFBLTjhyYk1rY2hBR3RWU2NJVXpZV2hP?= =?utf-8?B?bTlaUFNrZ1JNOExBNlg3ekRHclJHNXhLT05hSGh4eHQ5ZDl4WjRVYjd3Ymxz?= =?utf-8?B?WnUvZi80WFljUmt2TG9ZVExZQWtTRTFwK3FNMVhyWTUvSzEzV0VEWEZsaVBt?= =?utf-8?B?aXdneC9MQnVKZHlpamtSMFdmcVRWSU8wb2k3ZnRiQm8zZHpxZkdhSEloUFZi?= =?utf-8?B?dUQwMFJWbS82YjZVTW1EWTROK1lwaU5GUWN3bno1Wk4ydWhOZEhRUnp2aGFX?= =?utf-8?B?a0hxTm83L0JjWVJLclp5bWNtenJVeStoS1NZeXpQWEY2QmVuclJrZjk3K0p0?= =?utf-8?B?bzJaT1VBUUZwdjVQYlpKYmVKS2ZOWXpUd2lNeWlMNmVNRW81dDVRZWFrQnB3?= =?utf-8?B?aVNRMDh6T1ZpVUN1ckh0R0tYS0pqcmZ1cHpKMC9jdjVHdk40ZyszNWc4bkFy?= =?utf-8?B?d0hzS05sRkhzMGlHOEFYME1QRlpWZERUSzRseUk1MjlSbE1SamdGMUJxMWha?= =?utf-8?B?Zkw2dWdIUlVqbDNySVhLVTFEbFVzMmc4cFVSM0xLY2c4b3hLVXh4RWFuVzdE?= =?utf-8?B?bVpWS0luNDJyYkhlSGhXb2xhRU1MNGpidy9oa1JjbjJ6d0d1ZUtNWTN6TEMr?= =?utf-8?B?bmp0aGRDVWZzelNNeVZ2clluVTBGQ0N0S1JlVWdsb0ZWc2RCdjFaQ3M0aXNK?= =?utf-8?B?c0xUYllrQ1hBL3FzTWhGSWRtem1JVWl1S2t3Q2hxTVlZanpDd3kwMkdLNTVC?= =?utf-8?B?azgyTXdubjBVdlhrc2VtU1l0RlBDcHgxMW5Ea2NDZEQ3V1AyR0xGSlJ1Snd1?= =?utf-8?B?ejdleEtWWHpUL2V1bFlUaHBqeTZzUlVsek5nLzlUZzZsZjFkWmZJNlJWY0o5?= =?utf-8?B?dVM5dkNSQnk5NGJjN0EvZVBtRXYxQlQ1cDVKZHRHTWF3KzVFVDgyV3lSRXhN?= =?utf-8?B?dXQwUFl4bzE3b2FkNjYxcHVFNjd1anl6bzBjcW80cHRFVEFkQkhiMzhZalc4?= =?utf-8?B?S3YzUzQ1OGdvTFF0UDc4ZWwrWUw1M3ZONTl0NEQwZVJBQ21lSmtXRmtwcy96?= =?utf-8?B?aS9ZMkdSSHNqWE1PQzFqWUY1dmkzT1hsMEpQVzEyOGhjczNKcFZwYnZpbko1?= =?utf-8?B?bkZkZFhFRHdBMzYxYXJLczdFbCsvZnVtYTZMUUZSVFNXQVBxc256dXhXV3U5?= =?utf-8?B?a3phc2w5NmozdVFwSjhSdE5NUzlTdnhoL3k2Y0N1Q0kxb3J1MWFxbTQxYnpS?= =?utf-8?B?bzZadXhTS2tJTWJOMTkyWnR5ZTZVS0tWc3hMb24zQk5QcFBUeVltZjdWT1E2?= =?utf-8?B?Zis4UlpjdlBxQ1UxMUFVbGRlUFB4TWMvS24zd1R2WDNjOU51QTdJMmc4ODZ1?= =?utf-8?B?U0FHNlMyclptSGdwY1Z6dVJGZUpvVTBHdm51d2JxSHE0aHdBNWxadldaZ3Bn?= =?utf-8?B?UmtXcFNpSnUwT0FUZ3B4M1ZmTEtsWjU2OEN6d3A0eDNLckNTTnVXc0hNK1dZ?= =?utf-8?B?RFlJZnhueG9XQmNraGZTc09WeEprTndKM2htUnZ3MjVlUXNhVGltdG02U2No?= =?utf-8?B?SlBqeXlvMHlZNWtCYnZwOEx2YWQ0SGdZcmxkN25QbEtLay9iSHQ0cDUzdjdm?= =?utf-8?B?ZUlUK3F0RWFueXY4bk9zQkdndVgyUWVFdk00anBZVHJLa0pzdCt5YTBEemJY?= =?utf-8?B?RHZLTmFxYWRoK3lnd1V6cDJkQUQ0N3RqSFJHZThVMjR3WFpIK2VmeFh2NmhG?= =?utf-8?B?QXlnZWRPaFAzc1ZSY3ZZT2F3SmFacERXV0tXSFpwQXE0SnQ1MzlmK25UT015?= =?utf-8?B?SlZ5TU5pUW9iSHdPMkpKeWozbzRxRUVYSm1TOC82SVNWRDlnOU91S2thNXVE?= =?utf-8?B?THdvR0Y0RW9lM2NRRGhrUjVXOUs4RWNZdWVmYWN4bGdOUXJqMSthMFpKeFlX?= =?utf-8?B?aFNPVHlDeVUzZi9pQU1DR0tZUmxGbWQyM2l5djh3TjBOdTkwWE5rMFdxUGFN?= =?utf-8?B?dzRFTWxzUUpjNHVzUjZvNWJRbUViK0dJYzk2VW5TTWRrSU93bXJxSE5HdktJ?= =?utf-8?B?VkN4ejhGOHBrWjhwd0xKdDlFbmc5UkgxK2czVWxDVEFGWkh0NWFUSFg4YlhP?= =?utf-8?Q?6M6InyVhgEXhX8wQQ5M2LFebqdn93JAWADnV6H5LFkFCM?= X-MS-Exchange-AntiSpam-MessageData-1: BkIuAp73Kgg+kA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4d41d634-d094-4f29-ab18-08de7546ee2b X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Feb 2026 14:54:23.7998 (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: lm0U85bTeqrRcCPEZWUnII1W5YoqTqSZbsQasD2zNK5dxsgZ7CQf8iL96ZdufrSxNSvAjXqchFyArVsVjUxmTg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH1PR12MB9598 Make `Cmdq` a pinned type. This is needed to use Mutex, which is needed to add locking to `Cmdq`. Reviewed-by: Zhi Wang Signed-off-by: Eliot Courtney Tested-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 Thu Apr 16 17:32:54 2026 Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012012.outbound.protection.outlook.com [40.107.209.12]) (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 A5C243ECBE4; Thu, 26 Feb 2026 14:54:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.209.12 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772117676; cv=fail; b=gE5dY2lNknOUwIDr5Q/aNK2bWbRvMISTTvUTJx2hfV1CK6roQTWdZp2iiQQ4WMDxywE9OpbNWNSfzIwdE6W4DbNjciiQ4QH/yMuPOQbfSbX2pxVDTEhIDKV7AqQsC4miq14WrJ9Es8Pr2FbYFkE9mWvREQeVy7pxW9WQVd1ytEY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772117676; c=relaxed/simple; bh=NL2zVFP1L2GAdlVCmxcVPUUKh8VK/MDDxaM+O67tzk4=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=W3vv7C+JukVsUZZAi6KfUQ4PZSvOUlV+IsfQqN90hCg3FJmuoQ6yhCJ5X8d5pZdHDbJwzjDWT/er/KC11UfKTK72sv4T3BPq3K2hywu29BObiYQcBvGYZuRAazantuXJEY4KrdifnVESoZb7lX2eysqVPxw/SwVlmoU7RibaBSM= 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=jeS5Q1xE; arc=fail smtp.client-ip=40.107.209.12 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="jeS5Q1xE" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=LWGKaTXF8G1bdC9xV39363cZ1Ost0uHuymf0hWLXx0K3G5uS7Xa5LV97h2hCjf2hC3BPbP6bWUDq0aC0YmAzwYc33bYleK2zDbOKauEFKcedyNq/IUMd6ah5QqV40Yvo3wRKz+IeVaX6y4cr3+gjr67efZIgdtqWzNf8HQiwz4Qr3hYUGSW/w8pfaK0DrUX6kTEfRc4c0+Do5D91OGVCLl2bDqUqBJOASo2Tg2t094Yvzil28JMSzmEURyLZumZFND+T5Mj0flMjsiY2jab1OvWUelV/RlzHeDMzAVdHUtUB0xRzm969UVgYqNVwTsX7nlop0j4DWX1UJI9VxVINqw== 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=cpxaSbRKlOV1SmbEkgnpBAe8uAzratSOMH+dAZvsRAM=; b=Caa5heu+jYEOXJPmm03UDeYRjjWQLZ0voPyeKOFPwWZ4gtTjJyA+mCT7nrUuaBipu2EqDBlVKJKnvpoWWMfn5cPKloeynbvbQgulsKvy4b7QdOa/rPQoiLcoQr1tY9X5acQapx8PqTww4D6oOkMYWywK4ZamOJf1kMM+Y18yXqx0I7LYMgTGOLuZ5WSJhmMBh2bCA3G1+O3IkVYUGuDydNUQr+DCauLYqWr04ijXefx7QNwVRs7pCSx0oSBoI9JjYvYqR0dZ5bbFvM1Joy6vGeNA6qO7GkW6yY8rJKO4MDD/ap4KOwzYVEZ59cWKin7QTx/tHOmWwXEm26vTumn3nQ== 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=cpxaSbRKlOV1SmbEkgnpBAe8uAzratSOMH+dAZvsRAM=; b=jeS5Q1xEzhcEv3VsoIKbIL6XElPqfp5uRPlQ+I5drt5lGntSfmIFyjKZUnhK5IR+VO24c6xGVF/MyKHs8so1TOQiVPH5t2PDbg2vyDyTz3PNdzNyTjhR9EoyBzM7Do81JyPFAl7EFoxD2EIMtCH1CMP/sZZuGmgVv1FOCs13nMsOrz2GVY72cGtoESEGYULzdOd/mcmOYnwLSxPJiLNWhk1/ZDJRijOmw0uK4QZzGYmBkAz8XW65aNE81/+cCwCrPL3Aqw4u+AXj64p/BdcjF7aVxtxLhLAF+7PHNx+6xo09XXUsh5K9xK9HJ4H/Tj+z/Z7cxk+uz2YGhojylrQQuw== 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 CH1PR12MB9598.namprd12.prod.outlook.com (2603:10b6:610:2ae::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9654.14; Thu, 26 Feb 2026 14:54:28 +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; Thu, 26 Feb 2026 14:54:28 +0000 From: Eliot Courtney Date: Thu, 26 Feb 2026 23:50:26 +0900 Subject: [PATCH v2 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: <20260226-cmdq-locking-v2-4-c7e16a6d5885@nvidia.com> References: <20260226-cmdq-locking-v2-0-c7e16a6d5885@nvidia.com> In-Reply-To: <20260226-cmdq-locking-v2-0-c7e16a6d5885@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 , Zhi Wang X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYCPR01CA0110.jpnprd01.prod.outlook.com (2603:1096:405:4::26) 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_|CH1PR12MB9598:EE_ X-MS-Office365-Filtering-Correlation-Id: 73fc561f-a514-4424-e91d-08de7546f0b1 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|10070799003|366016; X-Microsoft-Antispam-Message-Info: +urbPeR66aOlDPw12oB8Nlkq+/KQ2F7fDwissFj04EkoCQ1qmsASzfl9BIHraT1liIXG4xwX9UGdCwGZsV0lLyUwhhAeM8rU6pNYV9drRWq1XwYaZBCkb/OFITUu7RW41Xtuc9JJmxThtHnO8ovCQK6b+0grtjEy+abJ3pMcVaDMsYKon9uKikkW8EHYN8CiYb7ADd2pqozXjsiSP+lJHFOPCBGv4R/Qh+ZWCSsaelWzIb0QRiAhjupgxzeCxKY5UIgtCSEAnCyyUXfE5SaMqzNpSAT6LhQG9CIjZ7xFUaGFQlFPvdhzSigwPhqb6+JznmNli9kl5SXx19cc3Fy9Jr2P+0m0PPm2THDdXpLqrajj9y7Bf88rYbfawsNHw+sprWzU1Xw2/BN8noIOznPmoq3xc6u/wIKtbFVjRiBEBUMRhiSYP+jp3vhIL0By68+6OKR9bOvlNbwFI6vFpQdakcvMNJCvP1TrnPwdZeuZliBYysKt7nWoPKXGFBLkkFvoxS/6Y3rF1OW9c8IZtB2xGctsMm6DwiVh+NNumhue3qnUIoGy9jrEKPGk+XgfF5ds35BxO7k+TjV5NZSy4LSIo40VzJ2HnsSghKqpyKH8icym04E1LwKFtD2p1gKDN7zCAbJyGxYyagBYRWHhd5sk4U3wlFyyc3RZIZ1cJVkn6DDExKa7Mz+Xm4pFyB1jlyi9Tqbyh+zNb4JsgQ1IiZNXo34IqGod0lIZlkKrQM8Ijug= 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)(7416014)(376014)(1800799024)(10070799003)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?MTFUVnlmRTQzVkpvS0xoUXlseTVMWkhmc0V6azcvYmZ0SUp6L2pKY0NzY2dr?= =?utf-8?B?b01hNkpBSUhoTXNVaGJvMldwNnlrVDFKbzRaYmpiL0hWU3N3RGQ3MTVHVGZL?= =?utf-8?B?NHZVZ29hc1NocGJJTHJlcmppdXlPNVp3SE9OQ2dFby8ybm5xUkUvaFp3MnlX?= =?utf-8?B?WnZxWFMrT0tIbFJmejNKZUFjakplSmF3K1FiclpiZElkV0JkZU9OVzdDa3hJ?= =?utf-8?B?NjIvS1lYTEhFTllUem5MWUhDM1g0YW1rR2gzUXlORDU2Q2ZQUm8vT0FRcjBl?= =?utf-8?B?SWpOeVBZTEtvT1BIdU9RL0ZOdzMyQlFVMmZ3dlBhVmlHRXFOZG1ma05WVXZZ?= =?utf-8?B?T1lPaC9nRDN0c0VxOVFXTm1tVzNIbWVnVlVody9wUDJOTXRBSWs1TFB1T3Nq?= =?utf-8?B?SE1GUlFrNmVFdjhNMVorem1lSG1udTBpOFJKbGliS3ZFcXVFS0dXaEtsU3Z5?= =?utf-8?B?R1VqMFZ6VGJtYU9VQzREd0tObCtaOU11QWV3WkJkZGZzRFR3emhvU1h0N2I5?= =?utf-8?B?NnE4VFpVVjVxWVVjdG5vVjNmSDNqRGQ3TVpUYzB3a1RmNmQ1ODNSaVBqN0tX?= =?utf-8?B?akxCWlFtWTc0YTduYlpYdWcvK3Vsb0Y3WUhlcE9jczcyeFIvZFVXUEJ2c0pT?= =?utf-8?B?MmJLUjdKRFhJY1ZocHNoSHUrL1hBNXlQV1FXNUdQOFZPWnFzVk0rZ2R5bHVJ?= =?utf-8?B?RGsxMUREbTFvTzJocmc1T1dYTGZjckM4djBkSTJxY1p6cWZpWjhWMDFBRGJ6?= =?utf-8?B?dHlxNjEyVGZwa3B4c2xWMHRTMmY3VzdkMGZVVGd5UjBzcDl3VEhvYlh2U0Fo?= =?utf-8?B?SXh2N2dORGduTTZwZmxLVVpCN2RKcnlGQlZzeHl6cnlaeHR4Z2ZSY1pvcGNJ?= =?utf-8?B?WWdoc1RnTlE1WTN6amJFZW96WUZMMC9MWElNRENRWlVxd0NpMTVwMWZsclo1?= =?utf-8?B?U1BNOCtJNFloc1lPRmFJMnpyUWZod1ppUGtKNHNmUENHcHhmTUwrdno5WHdB?= =?utf-8?B?T2lqK09uTkV6bDY5VjUzRmk1ZXBvNUFWVHAwZmRwU00wdFUrL2oyRmVTWXVu?= =?utf-8?B?VU53MldpOWF0UHZJTE9rWlZ2cENGZ1BHdkRhOHRYZVJ3aGE1ODRQcklKS1pn?= =?utf-8?B?ZnBlUDJYT1Z6Y3dsVm1KSVVlV3EzVE5YLzZLb1A3Q0NXSUMrOXZiR2FwNzNr?= =?utf-8?B?eEdYS0laQmtMck9hcFE5akViQzZZUWo1Z0lZLzRCd3pDQVdNemRGRkNLUEFT?= =?utf-8?B?M1FTMElJWWtveE11UURMU3Jjak52ZVdWQm9wUWtaWTJ1SDNNYkpiQldROXJO?= =?utf-8?B?M1RHOFA4MzVSWENZS1RXYzNEdnR3c05uVXdRMmUxTlBPWEdadE55dU0rYlU3?= =?utf-8?B?ZVpVdDNLdTBCa01CNmMxT2xISGdxRmQreElsRXVVSFE0eTRubHBKVFhueVZ3?= =?utf-8?B?OE5iMUdrdDJONzRvMHlvb3MzS1VpMWpOVk1jN3ZmMkoyRE0rOEZQSzZnU3U4?= =?utf-8?B?MnAxS1pBYjFpQmxKMHlWeG5FY0JtdzM1WVJsY3N2dkdBbDVzTDJNQmxkVHI4?= =?utf-8?B?YVE2cU5yOG9kRFFkb0tYWVp1ZzNMYmZuRmwwcWJTMDJ4cnVNNGhUOTNMcTVI?= =?utf-8?B?K1RZd2MwamRaYXcvaVJtNVdlNmpxVGhJR0hKby90RTVPcTJUZTRZTFM1TWpL?= =?utf-8?B?SUtuNkJvU3YvZnJOZnpyMEdlUUxQRDEydkl2TW1SSmJLMURKNXpYTkliM0gv?= =?utf-8?B?SUl0c3Y0UEMyeTZKckovQmtPQ1Q5VUcxWFhIMkp1bDV6aGZGbVRaWVNxamNu?= =?utf-8?B?V3l3eDZHeGtuM2lBaXI5dmZzR1VZR3o3VWIvTW1OQ2VSMnBXR0ZaSEQ1YlVF?= =?utf-8?B?UE8zL3FwaTlIanlIT3FCY3U5ZXZrdG9YZHhFemFPdmljS2NnNm1OaitnbXZG?= =?utf-8?B?cU44VTJlZjRQZU9mY2FCeGp4bVUwN0pHNUJQaUI4Ri9TdDB5T0xNVzBJY2hW?= =?utf-8?B?ODlnVHlRWklJSVNwWWpmYW5pUWwzWUNUSDdibXh5R2V4azMzbEZKSmROczRS?= =?utf-8?B?bFkybUNuWjk1MnV1bWthRzk3VU55akxqUXRla05IM1RBYXlSOWU1bVdaWm5X?= =?utf-8?B?RjdyQXZ2Vitna2ZZQjB4NXEyS1FLSFAyaVlPUUd1cStsR2FqallJY3lncEJN?= =?utf-8?B?c3M4MlBPU0Y2MGppSEhJZ2IyUi82dVdZa1ZnVkpkaVVGTnVsZmtJOS9wOFEr?= =?utf-8?B?cm44NnhCcXQ5WlROUVhEdW13aDU1aGhZdWZkZlJ6RFF4WVhPMUlGeGozblht?= =?utf-8?B?cCs4dzViOGZjMDlmUHRqVGg0NUdFbEtSRHRadmlXajIvM2o0UlVaWmRuZytG?= =?utf-8?Q?bomaM4SBqZo8zekLmtOOhfGQ03exQNxl090Jz2t7OxsxY?= X-MS-Exchange-AntiSpam-MessageData-1: qAQXDb0ADvurtw== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 73fc561f-a514-4424-e91d-08de7546f0b1 X-MS-Exchange-CrossTenant-AuthSource: BL0PR12MB2353.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Feb 2026 14:54:28.2395 (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: Bv7Zy1jbzUOSBIaqH+/gc97+6W6rGxccrAKcYUemEeD/9zmPKdrPc91ovyt6IYW2zyTdP+cN1WObiPr91YxLDg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH1PR12MB9598 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. Reviewed-by: Zhi Wang Signed-off-by: Eliot Courtney Tested-by: Zhi Wang --- drivers/gpu/nova-core/gsp/boot.rs | 8 +- drivers/gpu/nova-core/gsp/cmdq.rs | 266 ++++++++++++++++++-----------= ---- drivers/gpu/nova-core/gsp/commands.rs | 4 +- drivers/gpu/nova-core/gsp/sequencer.rs | 2 +- 4 files changed, 153 insertions(+), 127 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index 55899eba75db..d12ad1bd2cd8 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, @@ -214,13 +214,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, "GPU name: {}\n", name), Err(e) =3D> dev_warn!(pdev, "GPU name unavailable: {:?}\n", e), diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 6bb1decd2af5..5010587c96f9 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 @@ -794,11 +701,7 @@ pub(crate) fn receive_msg(&mut self= , timeout: Delta) -> Resul .map_err(|e| e.into()) .inspect(|_| { if !sbuffer.is_empty() { - dev_warn!( - &self.dev, - "GSP message {:?} has unprocessed data\n", - function - ); + dev_warn!(dev, "GSP message {:?} has unprocessed d= ata\n", function); } }) } else { @@ -812,9 +715,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 47ca31611927..4740cda0b51c 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 0cfbedc47fcf..f99f4fe652ba 100644 --- a/drivers/gpu/nova-core/gsp/sequencer.rs +++ b/drivers/gpu/nova-core/gsp/sequencer.rs @@ -356,7 +356,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