From nobody Fri Sep 25 00:40:28 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012014.outbound.protection.outlook.com [40.107.200.14]) (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 2D69437DAAA for ; Fri, 18 Sep 2026 02:13:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.14 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789697592; cv=fail; b=tsl127Efgvq2H+Dm2C/70sMnhHZVd6OcTPWF7m0891eeAgS3+zALwgdv4mBR0/XE+HFO12ui4Vo2Fq3I8YRrgCJgAYiz5vCrYqxRNjp71YJLtxSMf86j7aWWLWxQUD6oQ+r/DhnDiPqdBVNEaXFicrKZjEdrxXBDc32oCZpeZA8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789697592; c=relaxed/simple; bh=43JYzRHwzsqmsIFH4VKW3q7JRxFNnyNNbaQU0ZRPbpw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=kkaDvEVft2EwauBURY5UyqATqcIBqlUZIj0qWdSR8ANPSFis948kwESpVXgDumV+FdWBxsjvqBP/0OE17bSwAOw07Zkk4KF/OdJ15+mSTPRsKE+GpTXrU8mHn5q/tQERfEFaqOpWLkks4zOLurbObIvpi+aToCvYcEl9jKfNRjM= 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=jVuoIbUk; arc=fail smtp.client-ip=40.107.200.14 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="jVuoIbUk" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=igto7KauOibnTjsEaHrwRgXVH+D0zpue4DGjDqylD2T8YcJe2ceYZ/c36eDfZ2pDyIrwY0pCPPA06Kt7YJzFKZWLUtsSDOC/8mA//G3QyO9f8CvkjlTBWQCSz/w+LL/GDj4ACK85zz+2usf3e/x1yjeOf0JLs9tvZa5qW+D3/+DOM5sL7/Inb7fjJTpOQp1McwP7sw4r3L1eyuyMS55gu77YkQYSlh1vGLudQrpXr5Hab6uLTL/Kh2yoWeAV4cCBsdMnJsscjC7tk6FwLkSiD5rMamFyLSnXJMEpjXBH3ZmO2FZb3VKrx4emEPhdMqI7mJXb8OlH9Ssj5W87dF4rhg== 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=YpTdP7WLa1ye0z+lGpvFlMDKLTKOa3TSOmAT8fvTO9A=; b=EJoJiO7vjAXg0LzcJY1OaSmOEJAYaxXQjZKTaKCiF0eONXrijAe9I2MZvuo+KuXsc51PtLOMtb2MNWe4ezPXy/o1AFaV5RpbEQwFediXcLieOrmGupO78HZv25aboEiCrRUN6aXZwPJJOkuYhcyiFZHenBPLx5v5z68dl4d7Vz4qzAPoChChYCkcykk9uDt1Ejd1TsXg/rTZYRBlnN2zvKtIKwWwC+kCoZyJVzj3vJK0oYviLLIOz56u0TC9RCxmBogBoEzvgPLmD47BEBijD99i9kUw6AM6+cGB7pYD4X5QXWO7qFUzXm5E8xVtOW9ANWZphNlnDohHY28kYoq2+A== 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=YpTdP7WLa1ye0z+lGpvFlMDKLTKOa3TSOmAT8fvTO9A=; b=jVuoIbUkihTAdTjOb/d1sH1WcnRVNEBPFT4POnwrc9jgaoqwz+AkDYiP11laZzhjIKf/U3BfFWHe1QfQzGP4yA65RAwI5pgT5ktQQHMTTIzALhhXtkAZwyb9R+pHC1puAIWHRNRlmpHXnnSdIxvv1WtiPblat+v1zZRwgUyjJIJwGGs34HUijpIZRcQDxgI/d4i99PlwKV72OclVPH64SIT2UTgEmseqja8yyN9ZxL2kU9Y00LaYHvG2yS+tN24F2Otx63NEmzDdcsSvwbp/kBLi67Za4lDbtd37lCLVwYWW7QdCUyBSax+2wKCLzhp1xZYdAzBW2BjcdPtNWU1/Rw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DM3PR12MB9416.namprd12.prod.outlook.com (2603:10b6:0:4b::8) by PH7PR12MB8015.namprd12.prod.outlook.com (2603:10b6:510:26a::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.12; Fri, 18 Sep 2026 02:13:04 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%4]) with mapi id 15.21.0406.007; Fri, 18 Sep 2026 02:13:04 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Timur Tabi , Alistair Popple , Eliot Courtney , Zhi Wang , David Airlie , Simona Vetter , Bjorn Helgaas , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , nova-gpu@lists.linux.dev, LKML , John Hubbard Subject: [PATCH 1/4] gpu: nova-core: record the BOOT_42 implementation field in the GPU spec Date: Thu, 17 Sep 2026 19:12:46 -0700 Message-ID: <20260918021249.1187837-2-jhubbard@nvidia.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260918021249.1187837-1-jhubbard@nvidia.com> References: <20260918021249.1187837-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH0PR07CA0103.namprd07.prod.outlook.com (2603:10b6:510:4::18) To DM3PR12MB9416.namprd12.prod.outlook.com (2603:10b6:0:4b::8) 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: DM3PR12MB9416:EE_|PH7PR12MB8015:EE_ X-MS-Office365-Filtering-Correlation-Id: fc8f5c14-decb-4b0c-cdce-08df152a5ed7 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|23010399003|1800799024|366016|376014|10067099003|11063799006|18002099003|22082099003|56012099006; X-Microsoft-Antispam-Message-Info: FMnfjKR9roMIhZgG4GcyoR0n9PgN9dPBhFuoqD9RrrmfrAWxsoUydJnQFsH4boJKKy83+eCzwCv0mZPiPXUi9b7euz3jqTaJdPxD5Xfw8O9upmxrOaHAY8ZCEgML74CHiULSsOWR9nqFCmiciscYhUpT0/FPQfx8u22fNPty+ui6ktF3ycU2v180BouiyVAlOP2XLvv7Qt8yQKaFJE+VAhTv1Q62r1EtAyny9wQD07BPr8mFl3R2MfRWhKrHwTJ/O2DNRONcw3szsgO0otkOKpmpudZb/zjMZJ9WpLiGuUg10Me1nzdCpZJ9dS4KnCweKL4kf+hCdQgOc+DX6opAB5DMxukQHDbRUXZeOXpqiVSJLwefk+uNmapTVWD6/7XVzMZLqij8v0EMiqR5qzesHe86w8UY8THwKxVwzhjUYOSva47G3IieSrMr9gYM4SgbkPuvKeO/vpASjXqs4v2rVmajP39XoFQUXTvEGe3t3C0lzDnb1o1ojbTR1O3Wy8NWYBjMMtyTR9gAV+17NdIGy5srJpU68Vf30sp+I17X9Ztq/Boo7QcKEkhBbcCRyocCiLueXvF+7/R+swQZa0CFYqTJ2EqiwfajKlVVuc42UPrCWT3ljXZqNbtUa3rgq6R9ZXAQ9AyMHeWi/H189dkW6mz4IJNIQQnTDSdqSxxBMlk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM3PR12MB9416.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(23010399003)(1800799024)(366016)(376014)(10067099003)(11063799006)(18002099003)(22082099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?6iFjon54Ov0N/VgfZfkSK0oZEUjPwWH21lE9tRcpp/RcFnofZmV2U6SiukTe?= =?us-ascii?Q?dLGdi/tJICjM9ppXo9SuV7L8UeL2bVnEU7l2Mskoi4/sIeJqJ/kLBWv076KB?= =?us-ascii?Q?7RiQOst7QexJRqQ1/uUAViTU6PVOx4FJuFYn46wj68IvTlvRJdmDE+vL11It?= =?us-ascii?Q?8zdBKElq6yXgzbMjmKNMPWakqYbeOakVuLlbhfXDJSdhca6qHqmAz9aCc5Rc?= =?us-ascii?Q?RtAxje8UfgVKK092sflZUvSGhZXHHi8Uivnf2fLWuo+9lFbLmeichZxd2PJU?= =?us-ascii?Q?vWaGPPwyohpjoWKQGHHcFJ9g3a+WEF4xMLDa7+5I5mZsK9STkhSICLfm1Ko6?= =?us-ascii?Q?9EiHw/FePEge/BSwcm27QuRzGOVvM/+LtJBHKivaveM1D8rhtypy5jrTSxkh?= =?us-ascii?Q?pASeEYw/vo3IokcRL76p/iI1ZgfDM2M+rrqFSw/XseBNjxwYp++m1Y63rRTC?= =?us-ascii?Q?hvzPVtuvnB+3/lCaomeMdp5nUVlXXVk6YAzlaAVgWSzOLfYbIAstvRQChNFC?= =?us-ascii?Q?KyRBh9H3JhCINXuP+DCWhpNeNvJT5SE1kqhkiE4ZlLPD9cwXCvRiDL4svYjY?= =?us-ascii?Q?fzhF2Ts4q/Wv8Y6dlDSGRa/3vsMXrMvHe+vu0NoLCCLEjxnKySbj5CQb0OIa?= =?us-ascii?Q?MFdrJRYWqEUFQ3Bx/TyGuhvoeBEX/9Y8RmzCLBOTpj86q556qBbQbT4riTH8?= =?us-ascii?Q?JB4sLTfzNeJNuHf13gSEoNP9XJ11FmY/F26h83xrRNTcQ7E1J6tkg7UrScy3?= =?us-ascii?Q?2sCGhLbh3SPymCv49AdpDvbSwyVCruhaYe3ejU39+01IeTclKFy6YTiUJtLC?= =?us-ascii?Q?zkeBBkH/eZnNv0M5/ZCNmKe+3egGtKU2vFg/9ZUjjxrvMEOX4HtS6jWPhoUv?= =?us-ascii?Q?9ZmRVLHjot3rCqMcfOYR8ArPWX4SaXe4BjgjZgifK64efekhrSkhCh/B879h?= =?us-ascii?Q?X75WF/FoThxhtTxt76hPA4ouxD+WOFplhxs8/TnBmBwinlwCeY66guQHOjd8?= =?us-ascii?Q?CxKGCcC6HmATBPxnp361iXmFNeucbxYMLW9b1Xke488/HToribkbHGXvCWvg?= =?us-ascii?Q?Bace/CZyOJ+01TV2lXm7v9a1vId6jzzsRuaR89PVReZZfmf5H4sgrn26+RtU?= =?us-ascii?Q?n18K7tJBOZHwEe7217herLD6KqeD4IJuExnklJFdBaBhpHH5/etm0YOqG5VI?= =?us-ascii?Q?5DVFr/wCIn5e+uEOCYpQ+EMqJt4w5RKoedS/dQWEW5kXFqqEt4GvnGejzulD?= =?us-ascii?Q?2JUmaMjzOXn5e8f9jFVvlg/whls3Qkz2t148HyGf2kYbaFIGFHKtA8PrrWNa?= =?us-ascii?Q?9fZDiA/4GaNrv0sbd71dJslO1n1zY/ZWbWdezaZoUUlOYZWOabeaqqIO7N0w?= =?us-ascii?Q?PIU3Jstl+4VnKr5OEFPKOjYDgib6TOrVNA8SYzbODtIWWJAJS2XRK68OoyNh?= =?us-ascii?Q?Buy7M4ml+rxSE3ow1af4w+dtnE6MqNm7FTyn9nrlCMknR2ifTT8l5kpj5nWW?= =?us-ascii?Q?IPBeCqWsxN+gozQXhEeY2HUNsa+1zg+8May5+D5SLE1X9YyH42pY0zr0x9D4?= =?us-ascii?Q?unDZeEsGQSCWIpW3sArJukE5dvZOe2kjr3UKBqIMnZ146Z1N+vD7hLzb6ud/?= =?us-ascii?Q?C3UB9iv86upeqSjbAr8DMWiMdUbQqJSUYwJN41+hLk0a32CmTyz/JylR3Fww?= =?us-ascii?Q?bRcXlH3zgwhWPDPxIhi8m0DQn5kVUHeNO2wFnn3iw65RuMOtDs8WoO+H0CXP?= =?us-ascii?Q?3/dh4DkC+Q=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: fc8f5c14-decb-4b0c-cdce-08df152a5ed7 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 02:13:03.6151 (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: meZGgmjtjv0CaQlsPL81p0/YI3g3bCJ4SBrY3MPNqh/JqBHvgwyMC6MOSWEPzQje2kiQy0PB8TS1HdURWhAfSQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB8015 Content-Type: text/plain; charset="utf-8" NV_PMC_BOOT_42, the register that identifies the GPU, carries an architecture field and an implementation field. Open RM keeps the two fields as it reads them, and the GSP log headers that Open RM writes name the GPU by both. Nova-core combined the two fields into one chipset code at probe and kept only that code, so the implementation number could be recovered only by undoing the combination. Record the implementation field in the GPU spec beside the chipset code. Assisted-by: LLM Signed-off-by: John Hubbard --- drivers/gpu/nova-core/gpu.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index fd1a74913d7c..cecd8e79430d 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -213,10 +213,15 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Res= ult { } } =20 -/// Structure holding a basic description of the GPU: `Chipset` and `Revis= ion`. +/// Structure holding a basic description of the GPU: `Chipset`, the imple= mentation field of +/// `NV_PMC_BOOT_42`, and `Revision`. #[derive(Clone, Copy)] pub(crate) struct Spec { pub(crate) chipset: Chipset, + /// Implementation field of `NV_PMC_BOOT_42`, which distinguishes this= chipset from the other + /// chipsets of its architecture. + #[expect(dead_code)] + pub(crate) implementation: u8, revision: Revision, } =20 @@ -259,6 +264,7 @@ impl TryFrom for Spec { fn try_from(boot42: regs::NV_PMC_BOOT_42) -> Result { Ok(Self { chipset: boot42.chipset()?, + implementation: boot42.implementation().into(), revision: boot42.into(), }) } --=20 2.55.0 From nobody Fri Sep 25 00:40:28 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012014.outbound.protection.outlook.com [40.107.200.14]) (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 DD5B43C0610 for ; Fri, 18 Sep 2026 02:13:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.14 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789697598; cv=fail; b=LzYtd1BvY28EKw6xX3pYO/RpQFzd7deYXKaL4BJcSP9VTbgUyR6PZ4CPSq50vDh6kcbqNapLAy7HGy2F2Q7QJg1Hlw0K09HTi4kHMojrc5qNmogsjpZZxHyGdPkADyCqsw79zrSXcjMvFznhoM+e8UPqQ2Q2DPi9NeDqtnxCbos= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789697598; c=relaxed/simple; bh=+0eqoK5pcv3Y2HZFECWQxfFFs7N5g7fHCKccxnYetlM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=a7mCaKCelOOc+jg8gg/G4uj7CaJzJetNFq4JANMnLyvdLBmn1H7M8IrJQrK9jujoDVJQsjiE7B3BHFbjDIyFxAvV38IOBzjoZOQ/zEyqRlqfZ4LQm6kQowGw0UZqVADjsYr9X8JkfbjCSITa1gCqkbvdRHuX3ORhXe6ZnfeA/2s= 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=pWU0H220; arc=fail smtp.client-ip=40.107.200.14 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="pWU0H220" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=DNNueH5FpcgVHBRqhl1CEnBHwND8Zk9LldjsL+fCP/AOjhFBaonV0zPUWG0sJCmKHr8pfVpP0mwZMmMpSSKbJua3KE+Kc2OrChjNZXd57mbkC6mxszLdJFWsDRtLwGoThcidqXi29+zYEQ3lPebPZj2d3s8TZ/YMxu/uObqRIDE46sH6wK3hO6KEwQwxNKXCSdbh9tb5ZDSxzmR0IcZxA+74K1MRxHksd9KHnsrOGCPiNrKHSKg0ugc2q+nxPfo2wkUiY7oKq6l9x1ZemI6t/pouRZxB6Xi80YDxX9UyCcZO6cqC9B2vCXk8YgH1N8jc+4do5vzQjY0SpVzNSU7MkQ== 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=srbYfeC+SwEpkOkOnyUszSb33ae41QO8+svUxO261Kg=; b=HEBobs8RkS+wBMW4pB9qAh2xQk7CKZIRWkPL1bbvY+CCnaSyeSzUY0IAq7dkQsIT1WAbfduuHte14F0Zd5DM/9ZgYNcLja1aJSEN4bOEg0KjjZIMa9SQt/U+Lte/PNxLkxzbHezsduF02k3AydOeiW3wedFsOJmPPec+4+xwEOMzzf7ouJQK02lOm966n+5FNo0AfAEqS+SMCqAEvyc1S/z+zsQBbYXHGJagdhLN3vwDxhbcqIQhsjTpYNCukFIeon8HwVD+HbodVboopn8vhlI0DUGAspPBVE5aCQgGvTj56ot959L9pPYtd35VuJ90GHQ8uvq3aVwxbiEE68RJMA== 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=srbYfeC+SwEpkOkOnyUszSb33ae41QO8+svUxO261Kg=; b=pWU0H220mODKiYSYnx+PMkxTBncCee9DWBm6if+wttbb560qSm7huVIEfey4xF9F25ZpIZF7PtoS9kjmk9QZFKMrp0MBdkCsSbzqbJQrITLOphrziZGMFS9zmb40HOop2+U5Jc7HSnsedF5KEMwe17sME5mk43QZaqFg7yjQTWNluyBsBShRh2kheOKvlYmgLsLfsGIgHe0/racVHTRwFq2MiYYUhv216OXsoTFYZtciAggf90YVeov5znq4m8o92oiGZ+4EKAViWTi+OFOd7k1lbqqw9lcs9ty/MVPkvf3z18Hb0KCMkdJ+Yn4K2/qgqlOsQ3lJABR1LLxeUodxBQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DM3PR12MB9416.namprd12.prod.outlook.com (2603:10b6:0:4b::8) by PH7PR12MB8015.namprd12.prod.outlook.com (2603:10b6:510:26a::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.12; Fri, 18 Sep 2026 02:13:05 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%4]) with mapi id 15.21.0406.007; Fri, 18 Sep 2026 02:13:05 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Timur Tabi , Alistair Popple , Eliot Courtney , Zhi Wang , David Airlie , Simona Vetter , Bjorn Helgaas , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , nova-gpu@lists.linux.dev, LKML , John Hubbard Subject: [PATCH 2/4] gpu: nova-core: enable decoding of the GSP firmware logs Date: Thu, 17 Sep 2026 19:12:47 -0700 Message-ID: <20260918021249.1187837-3-jhubbard@nvidia.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260918021249.1187837-1-jhubbard@nvidia.com> References: <20260918021249.1187837-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH0PR07CA0113.namprd07.prod.outlook.com (2603:10b6:510:4::28) To DM3PR12MB9416.namprd12.prod.outlook.com (2603:10b6:0:4b::8) 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: DM3PR12MB9416:EE_|PH7PR12MB8015:EE_ X-MS-Office365-Filtering-Correlation-Id: 71d7dab1-d844-4d4b-10ea-08df152a5fce X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|23010399003|1800799024|366016|376014|10067099003|3023799007|11063799006|6133799003|18002099003|22082099003|56012099006; X-Microsoft-Antispam-Message-Info: 58gM2xwnp1nDGIA8WPuX8VeQ6si2McUHXvDHtNsAWIeJN2/D4v9v/SUSe02ZGfOTfbvW+nXp+eu/Igc0UWesS3OgI2kwrFDTbenHWC/vdBc5mGv3P//T8qZ/y8J+AFPplb3usp5kCr3/6rLW8j1HLzoyvNVrApwbsi4Gylf931w5am5U+i4elWZCnhXAXDbpOj4LyNhucrNWFP6WPttEpw7F6NvzwBCf7iiGGiyTIU2LUfZFH+jFeX1nG2wTLNVurXvFOAvL0vTetxHaj9a4iprLgRN71WKc9adY7ewbIRtNwVKAZTtNqTM4miu3e2BTDSCTO1QGx34+aHVXavJpvHhMWW9TGmOWhacFzD9l8+ExSnnxJMOsQ2GKzdLBvvjGkBcERRm4/ZxPcDZRHOC35FdKwiw9Q5hr5MiJT3hHg0VuNUgfSXsLEdIbHju4aurY+2qDHcdduGviUDjiZKTXvRa1Jn7NFh+iERu+EaejPac2uxKNg50Ka0nbP57RO4ao8KazJoZzDNKgD/cLjCi/WBXIsMGEtruLCMUyVMfULYDc+4wb9ktLYcFWjM7SnIuxhpKvwl6jabZ2J8QTU+sbwRWenVVxMsNlwls7z+uxQyLJ9wvI29yFs7mFpeI/iU3HWK9Pu0hBAxUXGw5Bb+nop6oxB1EV+HEwb4Dh2jtmtgE= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM3PR12MB9416.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(23010399003)(1800799024)(366016)(376014)(10067099003)(3023799007)(11063799006)(6133799003)(18002099003)(22082099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?qealAau2pjf9LWaLYe9jXdySrai0KDcusgvNa4TpDjjRdbrn7bBqYeu/5StL?= =?us-ascii?Q?egPD6WGrgQ4Cjs0q5uOScFzwGXJogzKMDFBcyCTohqebfi9gJ/+4e8tv06KW?= =?us-ascii?Q?z2/+MQKVST48r3Nu1Q2J116bzNfoqeUt/law+/bRHplbYnJvonDfxHcA78WC?= =?us-ascii?Q?OhWRcoeIG87cE5VgPA3oYli1iB3ykh/kaLMrzPXNMUgY2VD4X+uxQWx75Ixd?= =?us-ascii?Q?Uxr2OcYL22aCpnE6GSCbKTBsjgCRuYKvXFCdbS6tB90pYrxGstAkq4W3yY4t?= =?us-ascii?Q?DKFrKoKXF8sB67NPSQxySr/8R1SLMwUDRBzjqUGO/NuJ250fzFHTYUPPwcpK?= =?us-ascii?Q?AcCwFQ4DB83pT8ggZCI5KlpRMMmCqUDpv1l1/l0C/iED1pqB3ZLDeSt06ecc?= =?us-ascii?Q?XzUbQNDRYFk0d+O7v3/Z7LVOF9hCFzX+vs45LrvCRR4+v36cnDFxk7EdP/nK?= =?us-ascii?Q?lLQuSLQklJP75ju7rZWlqziP9htsSgySkIFc32VfpYNK0CtNGOJuwafPWpi9?= =?us-ascii?Q?ffa6LazuMEcC7MdZrnU+UYw8sAuwtWceiz0sD2X9klOc+3aO6wAT0tLjfNgW?= =?us-ascii?Q?W+4g+VCwpm2Ht6RQgI/vg7CR0gNiLD3ykde8MNwj+sUbTR7BmuIo5x46wuF1?= =?us-ascii?Q?XJz3gLi5FUuAf1/Kr08Wg6gg4oEvwM4JWKYb4L+HdLcgkFymT01JJeRInC9x?= =?us-ascii?Q?HfuggmRVj874KZz1Ck9Gzi+1Nf4ZRKWnBfodvRqfpPbjN1Rcz0E18K6fT7TU?= =?us-ascii?Q?DIV4m1QRVmiNsNlzQOdwzOQjefatR8oGsror3ZXfJg5+Wy9vp5dFledzJjLV?= =?us-ascii?Q?iddu8sbSszYYKr4HKovIGmOyMKYdEUyWSTNepFhjmugi/hCQCeaGofD0Z5Ij?= =?us-ascii?Q?PaDeORZ1tQ215lV+EUxP+A7j3FgzYoasLEOSWmBxpWxqpaETJuNGGyftyNQA?= =?us-ascii?Q?FcSKfHUnHgLjh0ydYDdaIphKeefTedGEuMX2MRGgjlRtF7v90+srjkuU58pN?= =?us-ascii?Q?cwMOs9vrrEy4ZMXy15g3a/WtRdCpGBDERYvslrIViPLszkvKCx30B6wNjiEx?= =?us-ascii?Q?tORJRtAn6Y7vDwYGS0MwUIx937EcL5bNKV6qgkBcu4wdH7MEYfUMWV/uXZBo?= =?us-ascii?Q?dcClAMkT+J7AvmQawPXM/LzpfpWzilSCuGllyOExyfjhjnZtVm+POe5/IWPU?= =?us-ascii?Q?+YocdsWw4PUEcAlGWBxgFBD90NRzYio4ZC0DJqWODraLVYtCnsuCd8wl6tkS?= =?us-ascii?Q?DIE6Zxd4CaebhEWvLSXIbv1Xd60WdkfRsBjXhQEyw/mhukqT0MXbqWouOt/z?= =?us-ascii?Q?D2SgvDU46FnbPSMqoItO0aA0pxJSyIhEFQNPOEbfquwM+34i9Yw5d8FPlrOd?= =?us-ascii?Q?GSjWOY1HidqAA9PMr4VnkDsCe1Wx39eSPwAb0C5CooUIerpEL2uhfiuZfAsy?= =?us-ascii?Q?mR6ls9wba9iRIKRat07IOzPlhprN8CASfmAYOrlrMKqqxSayCQ9HuKHNa4G6?= =?us-ascii?Q?E68rq7qBcHKYVZqbGt9thbMZTerP8e2IkZn6vyi2TNK+eQfJ28XbWrdQcf+/?= =?us-ascii?Q?6YXrM7Kl2GgCTY+P8ZC/pzVmpL7JfqEqZjXVyIl4i3Zjbbaauo0A/usmDYgU?= =?us-ascii?Q?dfug8PCMaGxqbpFjEWpB9cIKPvVDIRmXkTua0O9g3MvVoA+3yqQ0/2DhYKT/?= =?us-ascii?Q?vzE6nCUyJPrY+wvtsDDPj4kx/Rc8auFoUNvmRKAltQuyQy3Cenft2jJoF/Tf?= =?us-ascii?Q?HFZLm4H4gA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 71d7dab1-d844-4d4b-10ea-08df152a5fce X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 02:13:05.3419 (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: TNJTsD2toawnspc43rVjWxl7NtEDJAtKNWRvSdVX1eEh4EmFyKsCCVK9Q0fQn/ijYcLlaUWtPCY33C7LDnbMFg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB8015 Content-Type: text/plain; charset="utf-8" Nova-core exports the GSP-RM log buffers over debugfs, and Open RM's log decoder turns a dump into text with the ELF of the firmware that wrote it. The decoder identifies that firmware by a header ahead of each buffer. The header, in the LIBOS_LOG_NVLOG_BUFFER_V2 layout, names the GPU, the firmware task that wrote the buffer, and the GNU build ID of the firmware. Nova-core wrote no such header, so a dump could not be matched to its firmware, and a decode with the wrong ELF produced garbage rather than an error. Prepend the header to each debugfs dump, with the build ID read from the BLID tag of gsp.tlv. The log buffers are created before boot loads the firmware from that file, so request the file once when the buffers are created and hand it to the boot sequence. A file without a usable build ID is reported with a warning, and its dumps carry no header. Also, r000 has several more log buffers that must be provisioned, so do that too. Assisted-by: LLM Reviewed-by: Timur Tabi Signed-off-by: John Hubbard --- drivers/gpu/nova-core/firmware/gsp.rs | 54 ++++++- drivers/gpu/nova-core/gpu.rs | 3 +- drivers/gpu/nova-core/gsp.rs | 212 ++++++++++++++++++++++---- drivers/gpu/nova-core/gsp/boot.rs | 2 +- 4 files changed, 234 insertions(+), 37 deletions(-) diff --git a/drivers/gpu/nova-core/firmware/gsp.rs b/drivers/gpu/nova-core/= firmware/gsp.rs index a2db7b6ba131..e6ca8d559d7b 100644 --- a/drivers/gpu/nova-core/firmware/gsp.rs +++ b/drivers/gpu/nova-core/firmware/gsp.rs @@ -6,6 +6,7 @@ Coherent, DmaAddress, // }, + firmware, prelude::*, // }; =20 @@ -21,6 +22,48 @@ gpu::Chipset, // }; =20 +/// Longest build ID that a log dump header carries, matching Open RM's `B= UILD_ID_MAX_LENGTH`. +pub(crate) const BUILD_ID_MAX_LENGTH: usize =3D 32; + +/// Build ID of the GSP firmware, from the `BLID` tag of its TLV. +pub(crate) struct BuildId { + /// The ID, zero-padded to [`BUILD_ID_MAX_LENGTH`] bytes. + bytes: [u8; BUILD_ID_MAX_LENGTH], + /// Number of valid bytes in `bytes`. + len: u32, +} + +impl BuildId { + /// Reads the build ID from the `BLID` tag of `tlv`. + /// + /// Returns `EINVAL` if the tag is absent or empty, or if its value is= longer than + /// [`BUILD_ID_MAX_LENGTH`] bytes. + pub(crate) fn from_tlv(tlv: &Tlv<'_>) -> Result { + let value =3D tlv.get_bytes(b"BLID")?; + + let mut bytes =3D [0; BUILD_ID_MAX_LENGTH]; + bytes + .get_mut(..value.len()) + .ok_or(EINVAL)? + .copy_from_slice(value); + + Ok(Self { + bytes, + len: u32::try_from(value.len())?, + }) + } + + /// Returns the ID, zero-padded to [`BUILD_ID_MAX_LENGTH`] bytes. + pub(crate) fn padded(&self) -> &[u8; BUILD_ID_MAX_LENGTH] { + &self.bytes + } + + /// Returns the number of bytes in the ID. + pub(crate) fn len(&self) -> u32 { + self.len + } +} + /// The GSP firmware image, its signatures, and the GSP bootloader. #[pin_data] pub(crate) struct GspFirmware<'a> { @@ -36,13 +79,16 @@ pub(crate) struct GspFirmware<'a> { impl<'a> GspFirmware<'a> { /// Loads the GSP firmware binaries, map them into `dev`'s address-spa= ce, and creates the page /// tables expected by the GSP bootloader to load it. - pub(crate) fn new( + /// + /// `gsp_tlv` is the TLV of the GSP firmware, which names the image fi= le and carries the + /// signatures. + pub(crate) fn new<'tlv>( dev: &'a device::Device, chipset: Chipset, - ) -> impl PinInit + 'a { + gsp_tlv: &'tlv firmware::Firmware, + ) -> impl PinInit + use<'a, 'tlv> { pin_init::pin_init_scope(move || { - let firmware =3D request_tlv(dev, chipset, "gsp")?; - let tlv =3D Tlv::new(firmware.data())?; + let tlv =3D Tlv::new(gsp_tlv.data())?; dev_dbg!(dev, "loaded gsp firmware v{}\n", tlv.get_string(b"VE= RS")?); =20 let fw_vvec =3D tlv.load_file(dev, chipset)?; diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index cecd8e79430d..173c57179b39 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -220,7 +220,6 @@ pub(crate) struct Spec { pub(crate) chipset: Chipset, /// Implementation field of `NV_PMC_BOOT_42`, which distinguishes this= chipset from the other /// chipsets of its architecture. - #[expect(dead_code)] pub(crate) implementation: u8, revision: Revision, } @@ -424,7 +423,7 @@ pub(crate) fn new<'a>( =20 vgpu: VgpuManager::new(pdev, spec.chipset, fsp.as_mut()), =20 - gsp <- Gsp::new(pdev, bar), + gsp <- Gsp::new(pdev, *spec, bar), =20 // This member must be initialized last, so that the unloa= d bundle can never be // dropped from outside the constructed `GspResources`, an= d the unload sequence runs diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index 85967119cd7e..f8c675288d58 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -12,13 +12,17 @@ CoherentView, DmaAddress, // }, + firmware, + fs::file, io::{ io_project, io_write, Io, // }, pci, - prelude::*, // + prelude::*, + transmute::AsBytes, + uaccess::UserSliceWriter, // }; =20 pub(crate) mod cmdq; @@ -42,8 +46,21 @@ sec2::Sec2 as Sec2Falcon, Falcon, // }, + firmware::{ + gsp::{ + BuildId, + BUILD_ID_MAX_LENGTH, // + }, + tlv::{ + request_tlv, + Tlv, // + }, + }, fsp::Fsp, - gpu::Chipset, + gpu::{ + Chipset, + Spec, // + }, gsp::{ cmdq::Cmdq, fw::GspArgumentsPadded, // @@ -100,6 +117,68 @@ fn init(view: CoherentView<'_, Self>, start: DmaAddres= s) -> Result<()> { } } =20 +/// Longest task name in a log dump header, matching Open RM's `TASK_NAME_= MAX_LENGTH`. +const TASK_NAME_MAX_LENGTH: usize =3D 8; + +/// Header ahead of the log data in a debugfs dump, in the layout of Open = RM's +/// `LIBOS_LOG_NVLOG_BUFFER_V2`. +/// +/// The decoder uses the header only when `build_id` matches the build ID = of its GSP firmware ELF. +#[repr(C)] +struct LogBufferHeader { + /// Architecture code of the GPU, from the `NV_PMC_BOOT_42` architectu= re field. + gpu_arch: u32, + /// Implementation number of the GPU within its architecture. + gpu_impl: u32, + version: u32, + /// Number of valid bytes in `build_id`. + build_id_length: u32, + /// Name of the LIBOS3 task, printed ahead of each decoded line. + task_prefix: [u8; TASK_NAME_MAX_LENGTH], + /// Value that the decoder adds to each timestamp, zero when unknown. + local_to_global_timer_delta: u64, + /// Build ID of the GSP firmware, zero-padded. + build_id: [u8; BUILD_ID_MAX_LENGTH], + /// `LIBOS_LOG_NVLOG_BUFFER_FLAG_*` bits. + flags: u32, + reserved: u32, +} + +// SAFETY: `LogBufferHeader` is `repr(C)`, its integer and byte array fiel= ds leave no padding +// between or after them, and it has no interior mutability. +unsafe impl AsBytes for LogBufferHeader {} + +impl LogBufferHeader { + /// The `LIBOS_LOG_NVLOG_BUFFER_V2` layout. + const VERSION: u32 =3D 2; + /// `LIBOS_LOG_NVLOG_BUFFER_FLAG_PACKED_METADATA`: each log entry pack= s its argument count and + /// task id into the word that holds its metadata address. + const FLAG_PACKED_METADATA: u32 =3D 0x1; + + /// Builds the header for a dump of the `task_prefix` task's log, on t= he GPU that `spec` + /// describes, whose GSP runs the firmware with `build_id`. + fn new(spec: Spec, build_id: &BuildId, task_prefix: &str) -> Self { + let mut header =3D Self { + gpu_arch: spec.chipset.arch() as u32, + gpu_impl: u32::from(spec.implementation), + version: Self::VERSION, + build_id_length: build_id.len(), + task_prefix: [0; TASK_NAME_MAX_LENGTH], + local_to_global_timer_delta: 0, + build_id: *build_id.padded(), + flags: Self::FLAG_PACKED_METADATA, + reserved: 0, + }; + + // The last byte stays zero, so that the name is NUL-terminated fo= r the decoder. + let prefix =3D task_prefix.as_bytes(); + let len =3D prefix.len().min(TASK_NAME_MAX_LENGTH - 1); + header.task_prefix[..len].copy_from_slice(&prefix[..len]); + + header + } +} + /// The logging buffers are byte queues that contain encoded printf-like /// messages from GSP-RM. They need to be decoded by a special application /// that can parse the buffers. @@ -114,7 +193,13 @@ fn init(view: CoherentView<'_, Self>, start: DmaAddres= s) -> Result<()> { /// then pp points to index into the buffer where the next logging entry w= ill /// be written. Therefore, the logging data is valid if: /// 1 <=3D pp < sizeof(buffer)/sizeof(u64) -struct LogBuffer<'a, const NUM_PAGES: usize>(Coherent<'a, [[u8; GSP_PAGE_S= IZE]; NUM_PAGES]>); +struct LogBuffer<'a, const NUM_PAGES: usize> { + /// Header that a debugfs dump carries ahead of the data, present when= the GSP firmware's + /// build ID is known. + header: Option, + /// The buffer that GSP-RM logs into. + buffer: Coherent<'a, [[u8; GSP_PAGE_SIZE]; NUM_PAGES]>, +} =20 /// A log buffer at the default size, [`RM_LOG_BUFFER_NUM_PAGES`] pages. /// @@ -127,20 +212,66 @@ fn init(view: CoherentView<'_, Self>, start: DmaAddre= ss) -> Result<()> { type SmallLogBuffer<'a> =3D LogBuffer<'a, 1>; =20 impl<'a, const NUM_PAGES: usize> LogBuffer<'a, NUM_PAGES> { - /// Creates a new `LogBuffer` mapped on `dev`. - fn new(dev: &'a device::Device) -> Result { - let obj =3D Self(Coherent::zeroed(dev, GFP_KERNEL)?); + /// Creates a new `LogBuffer` mapped on `dev`, whose debugfs dump open= s with `header`. + fn new( + dev: &'a device::Device, + header: Option, + ) -> Result { + let buffer =3D Coherent::zeroed(dev, GFP_KERNEL)?; =20 - let start_addr =3D obj.0.dma_address(); + let start_addr =3D buffer.dma_address(); =20 let pte_view =3D io_project!( - obj.0, + buffer, [build: 0][build: size_of::()..][build: ..NUM_PAGES * siz= e_of::()] ) .try_cast::>()?; PteArray::init(pte_view, start_addr)?; =20 - Ok(obj) + Ok(Self { header, buffer }) + } +} + +impl debugfs::BinaryWriter for LogBuffer<'_, NUM_P= AGES> { + fn write_to_slice( + &self, + writer: &mut UserSliceWriter, + offset: &mut file::Offset, + ) -> Result { + if offset.is_negative() { + return Err(EINVAL); + } + + // An offset too large for a `usize` is past the end of the dump. + let Ok(offset_val) =3D usize::try_from(*offset) else { + return Ok(0); + }; + + let header =3D self + .header + .as_ref() + .map_or(&[][..], |header| header.as_bytes()); + let total =3D header.len() + self.buffer.size(); + if offset_val >=3D total { + return Ok(0); + } + + let count =3D (total - offset_val).min(writer.len()); + let mut written =3D 0; + + // The header comes first, and a read that reaches past it continu= es in the buffer. + if let Some(header_rest) =3D header.get(offset_val..) { + written =3D header_rest.len().min(count); + writer.write_slice(&header_rest[..written])?; + } + if written < count { + let buffer_offset =3D offset_val + written - header.len(); + writer.write_dma(&self.buffer, buffer_offset, count - written)= ?; + written =3D count; + } + + *offset +=3D i64::try_from(written)?; + Ok(written) } } =20 @@ -164,15 +295,22 @@ impl<'a> LogBuffers<'a> { /// Number of log buffers. const COUNT: usize =3D 6; =20 - /// Allocates the six log buffers, mapped on `dev`. - fn new(dev: &'a device::Device) -> Result { + /// Allocates the six log buffers, mapped on `dev`, and gives each one= the dump header for + /// the GPU that `spec` describes when `build_id` is known. + fn new( + dev: &'a device::Device, + spec: Spec, + build_id: Option<&BuildId>, + ) -> Result { + let header =3D |task_prefix| build_id.map(|id| LogBufferHeader::ne= w(spec, id, task_prefix)); + Ok(Self { - loginit: TaskLogBuffer::new(dev)?, - logintr: TaskLogBuffer::new(dev)?, - logrm: TaskLogBuffer::new(dev)?, - logmnoc: TaskLogBuffer::new(dev)?, - logroot: SmallLogBuffer::new(dev)?, - logrmon: SmallLogBuffer::new(dev)?, + loginit: TaskLogBuffer::new(dev, header("INIT"))?, + logintr: TaskLogBuffer::new(dev, header("INTR"))?, + logrm: TaskLogBuffer::new(dev, header("RM"))?, + logmnoc: TaskLogBuffer::new(dev, header("MNOC"))?, + logroot: SmallLogBuffer::new(dev, header("ROOT"))?, + logrmon: SmallLogBuffer::new(dev, header("RMON"))?, }) } =20 @@ -184,27 +322,27 @@ fn init_arguments( ) -> Result { libos.init_at( 0, - LibosMemoryRegionInitArgument::new("LOGINIT", &self.loginit.0), + LibosMemoryRegionInitArgument::new("LOGINIT", &self.loginit.bu= ffer), )?; libos.init_at( 1, - LibosMemoryRegionInitArgument::new("LOGINTR", &self.logintr.0), + LibosMemoryRegionInitArgument::new("LOGINTR", &self.logintr.bu= ffer), )?; libos.init_at( 2, - LibosMemoryRegionInitArgument::new("LOGRM", &self.logrm.0), + LibosMemoryRegionInitArgument::new("LOGRM", &self.logrm.buffer= ), )?; libos.init_at( 3, - LibosMemoryRegionInitArgument::new("LOGMNOC", &self.logmnoc.0), + LibosMemoryRegionInitArgument::new("LOGMNOC", &self.logmnoc.bu= ffer), )?; libos.init_at( 4, - LibosMemoryRegionInitArgument::new("LOGROOT", &self.logroot.0), + LibosMemoryRegionInitArgument::new("LOGROOT", &self.logroot.bu= ffer), )?; libos.init_at( 5, - LibosMemoryRegionInitArgument::new("LOGRMON", &self.logrmon.0), + LibosMemoryRegionInitArgument::new("LOGRMON", &self.logrmon.bu= ffer), )?; =20 Ok(()) @@ -212,18 +350,20 @@ fn init_arguments( =20 /// Exposes each log buffer as a binary file in `dir`, under the lower= case form of its name. fn register_debugfs<'data>(&'data self, dir: &debugfs::ScopedDir<'data= , '_>) { - dir.read_binary_file(c"loginit", &self.loginit.0); - dir.read_binary_file(c"logintr", &self.logintr.0); - dir.read_binary_file(c"logrm", &self.logrm.0); - dir.read_binary_file(c"logmnoc", &self.logmnoc.0); - dir.read_binary_file(c"logroot", &self.logroot.0); - dir.read_binary_file(c"logrmon", &self.logrmon.0); + dir.read_binary_file(c"loginit", &self.loginit); + dir.read_binary_file(c"logintr", &self.logintr); + dir.read_binary_file(c"logrm", &self.logrm); + dir.read_binary_file(c"logmnoc", &self.logmnoc); + dir.read_binary_file(c"logroot", &self.logroot); + dir.read_binary_file(c"logrmon", &self.logrmon); } } =20 /// GSP runtime data. #[pin_data] pub(crate) struct Gsp<'gsp> { + /// The GSP firmware's TLV. + gsp_tlv: firmware::Firmware, /// Libos arguments. pub(crate) libos: Coherent<'gsp, [LibosMemoryRegionInitArgument]>, /// Log buffers, optionally exposed via debugfs. @@ -242,13 +382,25 @@ impl<'gsp> Gsp<'gsp> { // Creates an in-place initializer for a `Gsp` manager for `pdev`. pub(crate) fn new( pdev: &'gsp pci::Device, + spec: Spec, bar: Bar0<'gsp>, ) -> impl PinInit + 'gsp { pin_init::pin_init_scope(move || { let dev =3D pdev.as_ref(); - let log_buffers =3D LogBuffers::new(dev)?; + + let gsp_tlv =3D request_tlv(dev, spec.chipset, "gsp")?; + let build_id =3D BuildId::from_tlv(&Tlv::new(gsp_tlv.data())?) + .inspect_err(|_| { + dev_warn!( + dev, + "no build ID in the GSP firmware TLV, so its log d= umps carry no header\n" + ) + }) + .ok(); + let log_buffers =3D LogBuffers::new(dev, spec, build_id.as_ref= ())?; =20 Ok(try_pin_init!(Self { + gsp_tlv, cmdq <- Cmdq::new(dev, bar), rm_state_monitor: Coherent::zeroed(dev, GFP_KERNEL)?, rmargs: Coherent::init( diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index 5da3d134eec7..6f8f330a0297 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -362,7 +362,7 @@ pub(crate) fn boot( let dev =3D pdev.as_ref(); let hal =3D super::hal::gsp_hal(chipset); =20 - let gsp_fw =3D KBox::pin_init(GspFirmware::new(dev, chipset), GFP_= KERNEL)?; + let gsp_fw =3D KBox::pin_init(GspFirmware::new(dev, chipset, &self= .gsp_tlv), GFP_KERNEL)?; =20 let generic_bootloader =3D hal.generic_bootloader(dev, chipset, gs= p_falcon.imem_size())?; =20 --=20 2.55.0 From nobody Fri Sep 25 00:40:28 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012014.outbound.protection.outlook.com [40.107.200.14]) (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 1CB37348445 for ; Fri, 18 Sep 2026 02:13:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.14 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789697595; cv=fail; b=q2nnzGp5pkcOqYESohdkLgW6kB7mYz6FM7MdfCbOHyJOo9fp8F+auiFw0UzTE1InBX5NUnli1h5w7Ylrw0RXH2JJwVmsaU+Vfl09njawSK5Z8i4MPl3X255DTaKWG6SD/Gogpns66F0mQQm3g2agqATJfWLbmwpzU0NJ0EBc7kM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789697595; c=relaxed/simple; bh=z2+U6NHjM8RFwda6rnRLJ/be1pvxhmjQYa3nF/xrdpw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=qkL8XK8Q0VWOcrF6UEEp1owCh0jJ1HRGT1Ry4oOTS0bk7calsmxniQ6BesQFaZNRUXq6kltTG57fSiB4M89VyfeUWkt09j9YftJk72iUV6P4XiekTtlyemGTfviqaROOjsqJLUeDmxtc5CTZYYwIgv3J4shJ3BvRaY4C/fxTJzc= 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=pOfrIlaV; arc=fail smtp.client-ip=40.107.200.14 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="pOfrIlaV" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=p4JXcMp+aT3Az22fFCEt0oWTyuKGD4+CR5zPd3QMXE1GSSWhNxEhws1aKSw35jBweQGg027K4bpefC/oIoX7bRHzVBHVCA2uXBMZZUFrQwiGI58L8HuE8zPfVQ2XahP7usoUR2ZwvT08OzmsOoFVc4LcOwE+/1R9jH+WWSAzrwZ4He6RR4FYUThJdeVoIcjdLWLKl0tf1n9x9XqcLdrOIxspZnJoZSNcvdNw8CQ+11JyCIu20PDr3VBKwpWXFU5h874pQWWCi5y9Qw5xeE3dl8aTe+Uz06vI4oGuemB7+miATYua3Hd2UxyySvpr1BQoqb9uaFLzvckwjCDpp0a8gA== 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=Kpt5mHgl1bVQ7vFeacxpEefUXfv8upwSiHghGsos1ro=; b=sphnvpHqi7uH619H8sGupZAUBQwqFPpQv/IFq+JiBQlhftMithcYZGg7PPfETO4/3K4LGAHpRMdmzRcwVs0WBNRXxi5erx3Br5XF3kGvdNYuWTrimMEtF8SbTodmod0iUlgU6g7GDwboAipu4UFGBLRUWpuI6FTYCTF8Tp8jXz78iQpjNH4kuTBp9I212hOHAOX3JDIhtnfhTCynLF4f3CRe/Ma7HYzEWSUfk9ErH+v+pQjkpYVa6VOUIPWynn+TpUbxm0M67m9wTNLW/zL8oFZamr8z3kucd8+8OUUBArEQbwG9j62fnHsyZ4UBKtEFd/Hqlujvegf738Gz/K+CUQ== 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=Kpt5mHgl1bVQ7vFeacxpEefUXfv8upwSiHghGsos1ro=; b=pOfrIlaVOiDIEhHExIHhLDdL4DXmZd5IPWEo1tehOWj4f6rCs4T3ZqkDibZzK5a7rAVZ97p6EVuAnKNWsSbeKq9iQya4Nc5b1DoVjwGWYjwM/jlgooAPcIcooBAJMx+vL2zNCnCOXu0oYKIrOl+d2YvWr2iMpKD6GXhPPsoqsl1Ba5CUOuEaHdgsGKpRbKZzYU/dP/g/62F+G31FOJsdkDauhY90cqLF5EHd7ZspipGy8RhMD0aW3OMwwSm4uPcwO56/ymE6OFoVme5wqkmLLQ++EDQU2mCja5m23ZuhOL6seTqbjOOogPvb8nP2xura26eArGFdMVVStA8pBkx0iA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DM3PR12MB9416.namprd12.prod.outlook.com (2603:10b6:0:4b::8) by PH7PR12MB8015.namprd12.prod.outlook.com (2603:10b6:510:26a::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.12; Fri, 18 Sep 2026 02:13:07 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%4]) with mapi id 15.21.0406.007; Fri, 18 Sep 2026 02:13:07 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Timur Tabi , Alistair Popple , Eliot Courtney , Zhi Wang , David Airlie , Simona Vetter , Bjorn Helgaas , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , nova-gpu@lists.linux.dev, LKML , John Hubbard Subject: [PATCH 3/4] gpu: nova-core: gsp: print GMC command names in debug logs Date: Thu, 17 Sep 2026 19:12:48 -0700 Message-ID: <20260918021249.1187837-4-jhubbard@nvidia.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260918021249.1187837-1-jhubbard@nvidia.com> References: <20260918021249.1187837-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH7P220CA0123.NAMP220.PROD.OUTLOOK.COM (2603:10b6:510:327::26) To DM3PR12MB9416.namprd12.prod.outlook.com (2603:10b6:0:4b::8) 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: DM3PR12MB9416:EE_|PH7PR12MB8015:EE_ X-MS-Office365-Filtering-Correlation-Id: cede1ec1-8f6a-4dab-e327-08df152a60fb X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|23010399003|1800799024|366016|376014|10067099003|3023799007|11063799006|6133799003|18002099003|22082099003|56012099006; X-Microsoft-Antispam-Message-Info: Ozyh2d9pnIxmVUred2XZD+3j4q7ix+Xngk1+jVzPu+viXaqCQgxIUysxHAR0kgRaHI+rVvlSbd/A4H0IHpuOuSnBrTnAN+K6uVnHtbFnnZqduv0hFUiS3QfzaR5n62WY+rz4c6GPiPddTRbMkpr3u999eSycT87oViMay7JkctqG4yatk+Kf+Rp141ZCIH3DJK8rkjdFeSPobVKZylpCoi9CNtNnKUdIHdkAHa6u65kouyGmewhBD4OXf2FELKy4vOowY++4t4h9zCthHGyAc8WmL68PeJOcR1sTKBJRVHPI1srvb4kBuX3fyfvcZ3UJFoZGYnLCsNe50EzGqMjg+9GO2SXXzTV2ZJt0aKGFo7hfb1bnijAfAs63qScgCuXErAIsOy8S0K8SegzJz4alyBP2flx4R3UjHfjomOppXa5S/9OtrmkFE7dSZpGSU1QYp3H0oVagBsf5oFRL44latja/vEhXqMwNdqL0qTvGNQr17jdoGsZIcIRbjmNn2srE7PCpSLmtp7OVVKauXEMqV5ohMWUxhzTeJJidQSbTrrvOyfwkrRYdlrRUuuvQd5lJT0Rgkogpi+/GFBUAHrYoA5xAb7vckrnQPk12ePXUEuuiyTiJd8uJY1GJMpAWdcgmu0/n482sOUKqeyADRcLt/MlTwTMC3UuBcT3qhgu54Qo= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM3PR12MB9416.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(23010399003)(1800799024)(366016)(376014)(10067099003)(3023799007)(11063799006)(6133799003)(18002099003)(22082099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?0QpBoZEMaDsapcbXlayHEG532D9kd2oBicC2lH8nmHCgvK589d17goHB/M8Y?= =?us-ascii?Q?bbA/7UjvPTODRsrp+mYDZwW6WfuJPoZI1G+AzRcn1vKvzrXjJHudBkgyaHXM?= =?us-ascii?Q?C5DA0wRMcr3kZT7B8lzAh9jG3a2xh1VMH3KpAUiRu+G6ZTp9jv9bDqQDLzw/?= =?us-ascii?Q?vj8A5zQow5WQu5ITB+2aayk0B027x82lMsIuEc6vgxFiErXVVlIu+4Ggl+3F?= =?us-ascii?Q?JI7r0eURNejHDrkgYnRVvYt7NH1yKLC1Lq3iFnM1A0Jcpv5DisETaJfn0yl2?= =?us-ascii?Q?WpxLlhcQ1G1ihUsxmuMEfJFPJ5TireYBSvWmL21akIzbIH2mdXsS2OktT+W4?= =?us-ascii?Q?6nyyc2FjvE/FS49Uf7KGHbtGWPg0lH3B6PBL1Nb7l9HBgDP57g3bjOdLAUI2?= =?us-ascii?Q?dW6XTQmVn/8C6D6bG4Vy/N2Wev5Ks+EF7TlX8/DyBAtg7o7tvkXpHSNSf0KV?= =?us-ascii?Q?u6bAxqg9CDtU1+m/I0IvYam6HmjucbSjqICnumQ0HXxm95hrkuuo3qVGRMyN?= =?us-ascii?Q?rzya40f1L1apLKzGXx4lhzA+rcc/a08TFwE8etAhSG7UgoyRLF0AuX6Mv+XV?= =?us-ascii?Q?stzShxgADI1BDFbAoP3EDVH3GGUr1l/8ys1LUv7HSEMQwKGBSS7HzbP4/XvC?= =?us-ascii?Q?06xAiT1T8mtFwZpJqYaWNpR+CaB1//5QUsQwpoVRvLuWycq2dr0gonYBTFH9?= =?us-ascii?Q?+VbxOPkY+CKB4ZD22V0A+ovQOKaHf59ujtdKrUHqnX6s3qsd0HLRZp3pIpaZ?= =?us-ascii?Q?Cih4whQh6AfDahMeVglNYbFGSNAl5XvlPwTMLrweKr5EzB2VYNVDJiuPKhjv?= =?us-ascii?Q?8GGws7Ehu4pe9WE0WgehkHRAyaqI1Ipf0TH/8MmBVHC04kQbVZ7y58hG+1vN?= =?us-ascii?Q?iZweYp+/gmHEyQbKcOpIyt8X4gVz0U7tvTUMmO2udZJJDEtmXdH7rO5NfTgq?= =?us-ascii?Q?QzlLgWYKin1m3NiefwkuDqeW8qlCU4rlfu1nS/fNMgBZBVEAbNFocNI8vIfk?= =?us-ascii?Q?o9GFo4VHOvkxbRjbB7ymsfGx04ew+XpMzBb+WJI7SzqiV3Up3oh6Djy6WPGf?= =?us-ascii?Q?8xSGddlJ2uHmbqr6VMfs1Fh7iKMQENZCbpP2YwPQBqqrTdYPY3LnN1QA8dOY?= =?us-ascii?Q?RWpYqmJYzVQyngPzAQTQBowKTkzCIJ9cqKXKvxbKBqzP2/Qbtc3c/Z5rvijX?= =?us-ascii?Q?RBjWWizCUHipNxJmZfggnYuRSjx1VKOnQJA9ypSYoqmxAlTJpMbd//3e1MHy?= =?us-ascii?Q?lnfg0SAVFZZ7wGJSKXU5FomZ9A6jlSJlRHHc5ar1IIhgZFSEqRk8U97mG0R6?= =?us-ascii?Q?M+JQh7OmiDlu1FkOH4LH42Y6vL2SJdWAe8gTxaxyEXXagSRmNRU6QSyyZL2U?= =?us-ascii?Q?pA9Rp0FhilqpbK86hAo1v70GlmbJ0bOHq7rvQKaJrhAPT1f9A97THYKq66aI?= =?us-ascii?Q?uGM574xZrOlMgkMrZzNI6xRYbS2l3WieqSIR4BO8UYsgFetGryVucXzpCexK?= =?us-ascii?Q?HqtT1CWFX4I6/xiT16LrtLm6LVqDc3mzf2Zbm2mSKWP8g96+2kAJYpO2Kwe9?= =?us-ascii?Q?hwAwYek68vQzxCeq1EqfpQawrFmd0mTxF7ucr0VNuK6uFQpCHLXXM4SqvtNt?= =?us-ascii?Q?X2DFE4mRriYnolOB6Ge4LaQErp9TSBSih36PPIfuhs41n6FeGJFVOBOm3S+G?= =?us-ascii?Q?N0tbQ5MeWuwj6oZfWVg7ro0AelpP97oxIMZNB2LwkcnCn2lk2t5NKQ0GC4sz?= =?us-ascii?Q?0Bk+OkNz3Q=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: cede1ec1-8f6a-4dab-e327-08df152a60fb X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 02:13:07.1665 (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: Jx0Z2RZQ2eyPXxlm+PRKn+UWEKlErwTP+pvxDOeI5pn9YIzFyOq1L+fyd2HR7350LoUNc9yuAcnJ382yIti2cQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB8015 Content-Type: text/plain; charset="utf-8" The GMC (GPU Management Controller) API names each command in the GMCAPI_COMMANDS enum of the firmware bindings, and a message carries the enum's numeric id. The GMC send, receive and error lines printed the bare id, so a reader had to look 0x10001 up in the bindings to learn that it was GSP_INIT: GSP GMC: send: seq# 0, command_id=3D0x10001, length=3D0xf8 Print the name beside the id, from a type that wraps an id for formatting, so that the ids stay plain integers at the send and receive interfaces: GSP GMC: send: seq# 0, command=3DGSP_INIT (0x10001), length=3D0xf8 Assisted-by: LLM Signed-off-by: John Hubbard --- drivers/gpu/nova-core/gsp/boot.rs | 9 ++-- drivers/gpu/nova-core/gsp/cmdq.rs | 13 +++--- drivers/gpu/nova-core/gsp/fw.rs | 70 +++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index 6f8f330a0297..8848feebb9db 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -42,6 +42,7 @@ cmdq::Cmdq, commands, fw::{ + GmcCommand, GspArgumentsPadded, GMCAPI_CMD_EXEC_GENERIC_BOOTLOADER, GMCAPI_CMD_EXEC_HS_BINARY, // @@ -169,8 +170,8 @@ fn dispatch_gmc_boot_event( _ =3D> { dev_err!( self.dev, - "Unexpected GMC boot event: command_id=3D{:#010x}\n", - command_id + "Unexpected GMC boot event: command=3D{}\n", + GmcCommand(command_id) ); return Err(EINVAL); } @@ -179,8 +180,8 @@ fn dispatch_gmc_boot_event( handled.and_then(|()| self.core_resume()).inspect_err(|e| { dev_err!( self.dev, - "GMC boot event {:#010x} failed: {:?}\n", - command_id, + "GMC boot event {} failed: {:?}\n", + GmcCommand(command_id), e ); }) diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index dd0b3dfc6f37..2b53b1e6cebf 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -52,6 +52,7 @@ driver::Bar0, gsp::{ fw::{ + GmcCommand, GspGmcMsgElement, GspMsgElement, MsgFunction, @@ -884,9 +885,9 @@ fn send_gmc(&mut self, command_id: u32, payload: &[u8],= max_response_size: u32) =20 dev_dbg!( &self.dev, - "GSP GMC: send: seq# {}, command_id=3D0x{:x}, length=3D0x{:x}\= n", + "GSP GMC: send: seq# {}, command=3D{}, length=3D0x{:x}\n", rpc_seq, - command_id, + GmcCommand(command_id), dst.header.length(), ); =20 @@ -1063,9 +1064,9 @@ fn log_event(&self, function: Result, seq: u32) { fn log_gmc_event(&self, header: &GspGmcMsgElement) { dev_warn!( &self.dev, - "GSP GMC: dropping unclaimed message (seq {}, command_id=3D0x{= :x})\n", + "GSP GMC: dropping unclaimed message (seq {}, command=3D{})\n", header.gmc.sequence, - header.gmc.command_id(), + GmcCommand(header.gmc.command_id()), ); } =20 @@ -1269,9 +1270,9 @@ fn consume_element( ), QueueElement::Gmc(message) =3D> dev_dbg!( &self.dev, - "GSP GMC: receive: seq# {}, command_id=3D0x{:x}, length=3D= 0x{:x}\n", + "GSP GMC: receive: seq# {}, command=3D{}, length=3D0x{:x}\= n", message.header.gmc.sequence, - message.header.gmc.command_id(), + GmcCommand(message.header.gmc.command_id()), message.header.length(), ), } diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index f7e83e75e53e..106d71f95fc3 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -12,6 +12,7 @@ use kernel::{ bitfield, dma::Coherent, + fmt, io::io_write, prelude::*, ptr::{ @@ -802,6 +803,75 @@ unsafe impl AsBytes for GmcApiHeader {} // SAFETY: All fields are integer types for which all bit patterns are val= id. unsafe impl FromBytes for GmcApiHeader {} =20 +/// A GMC command id that formats with its name. +/// +/// [`fmt::Display`] writes the name that the bindings give the id, then t= he id itself, as in +/// `GSP_INIT (0x10001)`. An id that the bindings do not name writes `UNKN= OWN`. +#[derive(Copy, Clone)] +pub(crate) struct GmcCommand(pub(crate) u32); + +impl GmcCommand { + /// Returns the name of the id in the `GMCAPI_COMMANDS` enum of the bi= ndings. + fn name(self) -> &'static str { + match self.0 { + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_GSP_INIT =3D> "GSP_INIT", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_EXEC_GENERIC_BOOTLOADER = =3D> { + "EXEC_GENERIC_BOOTLOADER" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_EXEC_HS_BINARY =3D> "EXEC= _HS_BINARY", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_GSP_SUSPEND =3D> "GSP_SUS= PEND", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_GSP_RESUME_DONE =3D> "GSP= _RESUME_DONE", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_ADD_VGPU_TYPE =3D> "ADD_V= GPU_TYPE", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_SUPPORTED_VGPU_TYPE= S =3D> { + "QUERY_SUPPORTED_VGPU_TYPES" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_CREATABLE_VGPU_TYPE= S =3D> { + "QUERY_CREATABLE_VGPU_TYPES" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_ASSIGN_VGPU_TYPE =3D> "AS= SIGN_VGPU_TYPE", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_DEASSIGN_VGPU_TYPE =3D> "= DEASSIGN_VGPU_TYPE", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_VGPU_PROPERTIES =3D= > "QUERY_VGPU_PROPERTIES", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TY= PE =3D> { + "QUERY_ASSIGNED_VF_VGPU_TYPE" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_BOOTLOAD_GSP_VGPU_PLUGIN_= TASK =3D> { + "BOOTLOAD_GSP_VGPU_PLUGIN_TASK" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_= TASK =3D> { + "SHUTDOWN_GSP_VGPU_PLUGIN_TASK" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_= TASK_COMPLETE =3D> { + "SHUTDOWN_GSP_VGPU_PLUGIN_TASK_COMPLETE" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_R= ESOURCES =3D> { + "CLEANUP_GSP_VGPU_PLUGIN_RESOURCES" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_PLUGIN_TRIGGERED_EVE= NT =3D> { + "VGPU_PLUGIN_TRIGGERED_EVENT" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_MGR_SCRUB_GUEST_FB = =3D> { + "VGPU_MGR_SCRUB_GUEST_FB" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_MGR_ALLOC_GSP_CEUTIL= S =3D> { + "VGPU_MGR_ALLOC_GSP_CEUTILS" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_MGR_FREE_GSP_CEUTILS= =3D> { + "VGPU_MGR_FREE_GSP_CEUTILS" + } + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_SCHED_CONTROL =3D> "SCHED= _CONTROL", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_MMU_FAULT_QUEUED =3D> "MM= U_FAULT_QUEUED", + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_INVALID =3D> "INVALID", + _ =3D> "UNKNOWN", + } + } +} + +impl fmt::Display for GmcCommand { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{} (0x{:x})", self.name(), self.0) + } +} + /// The headers that open a GMC API queue element: the queue element heade= r and the GMC API /// header. #[repr(C)] --=20 2.55.0 From nobody Fri Sep 25 00:40:28 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012014.outbound.protection.outlook.com [40.107.200.14]) (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 4C4903C1D40 for ; Fri, 18 Sep 2026 02:13:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.14 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789697600; cv=fail; b=lA8uAbkg+L2U6ZPJiiTt6ZCZW7T0eHRA7yl+XHPBIy2YF2OJbCWaTISoQLQp1+WzwaaEXKRkugUJk731ezbZrESAwrOUMz5jaEt3x7HLm3PIK2+dsCBU2jRNX2VD2JytshDvn1z2DS4qCi/W4ePAIUr3gZk6dtm5UAJfseGHOiw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789697600; c=relaxed/simple; bh=+0pM30y6eF/xY5MS4XEi2/xlG2BDAU82ddGtasZvz+o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Z1j7AxG5FZ3X2VzBUfi3FsJtdZB6rmppzBXxcmq9ZEpo9DHfBrDlSzUTAXiOQbGm34WTiTJMU7hynDNGFyx6a86fdDwK4lrInx59Q0YSCpAfjV+Ho7gb+clzAo2WSftVZO+n/JEqlja8Veu0z8nOPmgxe4Cw50T11ygnsTr7VYo= 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=oQuHuE8p; arc=fail smtp.client-ip=40.107.200.14 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="oQuHuE8p" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AnYZugbfOwsJ7RYWfo9aXdjw+ZoEpXbQF+aTEiRyxOK+flmoNqZKYnFkXH3TS9cYlfRMfiDMEIjnAOZ+sH9rEqp0KhllEGzWQnsFbbH5AAmWNHPNq0mBHTnC9Q9JtXFm1h8IAs5wraGsFn2L+15d6fXmpRncfROwvSEzKzT2AM0ktQeXBLm9sXZXF7cIcXaqGonnKxZ6E1QQiFp+//GP+w5klNp9bDISGvha+4RsHz3XtHej9LYfRy2g+ROwGuymeb3isAz4cz3Chs8XH4cK9sVY6Hef+yRzRgu1hLyrDEE7avFolX2GvJ3MoQyldX6gGWmxvHfNgFJOsjwPv0dQ6g== 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=6W3HSJ4qitUK2Z+4CC4pBH33j0uNp83IlJpDgT+xm+s=; b=eN+wkIY6FLVCb81k77GYiqZTUm//zAUjWuDvyv2GmDpVhFHzxWXlpUKErvb0Bb9maUB09fLaDTSYW3FmSauD4P5jQt5vq1Ag0Re8CiADtn6ISwo5RvyeLc/+vn4LgXiaoV/lwChFlDn4k97Yky62Dd3284Ta66w0zHQ/1ihJiCVIWIIVPeRKOMwKuuFWSaSI+Jq509fTG+qY9dOv5V6VBd/gQyQTZFWRb1oRi4+VQZ5XsvdpKdo9JB84iYPvdaI+C96tDu5gu+dsH5k8XEWndJBow8CrI7kjCkO3ouYRH/sZ9C9z421bWur3qDmYeHwBbVtApeNiyv+Z33wZFtR75A== 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=6W3HSJ4qitUK2Z+4CC4pBH33j0uNp83IlJpDgT+xm+s=; b=oQuHuE8pUvjzzAgmjLo2g1TfJDQyq8jA0C/TDzTkNYq9tae04VhkAGIW8Y4TUfJfeMS+D4sDci8JUcCt9GQYsXwDL6G+yiSiFS3BzOiKaoi8ZeuoxCSvPjPkzi9fSIzjbdfUWubMiaZjFOtZe9tAiBI6/RuEsYRYxAPo+wi0tshECtNXAH30m1KENeGu/7J1S8NIdWmhKnCkCMD8fx0Pir6J1MIKSwFTSio56+JuJ47Tjsn9OU9bZvnkhduVMfDk66wjUSIUkq/cRF+peWIX1CUvv+rpUA6jPPElbM5dkMEn4JGdQnSMMBJ1OQ7GzlI45MUHVeFCyBHJltiKOrQobA== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from DM3PR12MB9416.namprd12.prod.outlook.com (2603:10b6:0:4b::8) by PH7PR12MB8015.namprd12.prod.outlook.com (2603:10b6:510:26a::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.12; Fri, 18 Sep 2026 02:13:08 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%4]) with mapi id 15.21.0406.007; Fri, 18 Sep 2026 02:13:08 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Timur Tabi , Alistair Popple , Eliot Courtney , Zhi Wang , David Airlie , Simona Vetter , Bjorn Helgaas , Miguel Ojeda , Alex Gaynor , Boqun Feng , Gary Guo , =?UTF-8?q?Bj=C3=B6rn=20Roy=20Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , nova-gpu@lists.linux.dev, LKML , John Hubbard Subject: [PATCH 4/4] gpu: nova-core: gsp: distinguish GMC events from responses in debug logs Date: Thu, 17 Sep 2026 19:12:49 -0700 Message-ID: <20260918021249.1187837-5-jhubbard@nvidia.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260918021249.1187837-1-jhubbard@nvidia.com> References: <20260918021249.1187837-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: PH0PR07CA0102.namprd07.prod.outlook.com (2603:10b6:510:4::17) To DM3PR12MB9416.namprd12.prod.outlook.com (2603:10b6:0:4b::8) 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: DM3PR12MB9416:EE_|PH7PR12MB8015:EE_ X-MS-Office365-Filtering-Correlation-Id: d607190c-3663-4966-bb11-08df152a61d5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|23010399003|1800799024|366016|376014|10067099003|3023799007|11063799006|6133799003|18002099003|22082099003|56012099006; X-Microsoft-Antispam-Message-Info: HfJ8AwPtDqG6qqIOZ4TIFt6z88OSjstW0BzpQERlbe2rVrwfxMwvZ71Oz2B5jPNCwtHLH19VTnWY7MWq6UD38pbVc4VxgkgUpYKalNSvNexW3DC8DDt2UeJJ6B+FeDENl1CzpLwMGAvQCqvJbhPuNA7OnMY/c/34SRz6TrFZFEZUzesdPx/1tO9DQKeFTwymX7vVRWay31Lki7MzePxeQi/y27UiYt15y0gVrC+y7I8HjluJc+FfiDn1HATi5O6lyvekPElA9IVrL4fUzyv4r3XKzws5JyGE2OlBVNHA4Ta3z6/PmYKX7IED5zSSTJEfYVv7hDEJEbxy8FI6OPX0BExJriMCTRs8qNGXd57UYN/dLI+cwnXAZ/oCW0U8JDP/HcbpX7IQyiIJx+B+stYPBaKNEHm8476ALWYZxG+peJTEmwBMU8d2HEXXYHUM6A6eN8QBJAZymNbsKKPD4fUiU1eQtU0M8hHj0haQzPa9UzeZludHQL4ZJbEnrgpJGeu9GFMKfLM+Gc8vw4273ty/eiqQq7q7U/TrJPWGyABr5Ovfs4J9xc5pCyuUJ2QrplorwHT2KIbJA23TFov0I4+KFLAfKDRXGOA/2nBrJ1emCcIlD0XdZ3wbUiWF2twH9MAsz8q1Cwe8X7Vu7Px9TQaXDpYijXlDW76ZXrc8Ybd1eVo= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM3PR12MB9416.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(7416014)(23010399003)(1800799024)(366016)(376014)(10067099003)(3023799007)(11063799006)(6133799003)(18002099003)(22082099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?AbQz3DTdpIyxNOznnfnnZWoRpRc1YwmU1L7VOt0f03mZIJevI0BYVvO79GPB?= =?us-ascii?Q?zaXpY7R8S+U16/Wmw55XCj5VUPqn8LqXHIHvx2vNYSqvdnqEoBF5Yxl/F9Vk?= =?us-ascii?Q?usGm6k9E9Z8FwxufeHJwndCRb7CzMbN/RC6DdSFi2IzgBq/a74E2SxPWOG+s?= =?us-ascii?Q?u09cLnod2dGZhaiv13Q2LJoWCJZsmwgVzwoJhG3BjYNnX0pEy3c6UXTMSszk?= =?us-ascii?Q?NqDw+JqvHgleOXXvCTHSJfmygmHbXT9OYgaHFcJC/90pJC9PLNpwU5l/hjNw?= =?us-ascii?Q?XAjy78Gns4sntoV1W9mipTW7dYTXdKhGjA1a7AAOnf66VAQOoRpOesyrzcfg?= =?us-ascii?Q?MMQd009zACG3VG2aMbUUcReLwLZx/ckrpLiWH6Yc1hN0eZo0UAUDaiq3IZ7I?= =?us-ascii?Q?Z+rtDJZgjEuporKrpbQo3MhGNJZKZeI72zN4xu0N8+1EQc5SV3ClexrZd+Jn?= =?us-ascii?Q?ac7ggNjCW66MVAdStQdQih3bYbpE8lDq88XrvzJKB+cVYZHMEBMylfJuUcjY?= =?us-ascii?Q?I55fuhkw0SHlbgVoWAqkol+mc6bXqoFGzsrPYq9oYCF7hVPrk7SwJs7cXUhG?= =?us-ascii?Q?m2DQo1CRyCPMRlpUFkDU0mH7QnF7kejR5jKzV/2wbdl7A5zpyun444SbAF8T?= =?us-ascii?Q?I65qw1K4nnS5Y7l6A/LePoa3oY1bk0LInh+KxKsuK6gOkPIbMsTXv9ibS0C6?= =?us-ascii?Q?wvUL3hTrPtIiUr/J7uWvYfP8aSytSgK/tLgi6UVDRYs1vSTv+UTtHeQ3x7aj?= =?us-ascii?Q?nIQGayLceOZedgP+i42FHO/lFLYw0AQrt70i6RPfxGFZfKAdE32WUbSG8NwP?= =?us-ascii?Q?ec6PGvamb3YfuiagOxRh0BPjIdtMhGxkZTqzKI38+wB+sgMtgCqIkQhnjhAO?= =?us-ascii?Q?uh8BqX2L2JOjEZQaiO/1DkppaNXfbksOPnHOUH+OwHvQHSv11SgTGmZW8Fx1?= =?us-ascii?Q?Fis0ZiPxOiQkxl9QfB+DXu4s6g0KfQXSagxI4zZPbfHO/CF0J/Iv3CLjhDAw?= =?us-ascii?Q?TEIHxeW1M7jZskrDRfyMDf0xPOmdSR6m1wegZpLtFORLi97hH3El7DzbEwwP?= =?us-ascii?Q?Ow7CFURqlAyRT1fB+CPLrp2M6oZOEtZ8bkxSIzooB7zVEUy6Px847vdLeMH/?= =?us-ascii?Q?cmyVs7e16QIT6MN78rq99A0Kn0aQ7dSzidFAZPC/NzaI2YxqirHmc+ObEHVW?= =?us-ascii?Q?A5QX8wmZOR6gJrkURNXdExyA75EAtDlGPn6xkSG/RmfnL0Z5BcdBBcv92j6Z?= =?us-ascii?Q?HpH5l9Ly9wcVkfiqw6qUmWU60SZuUG58r1XNYbEqL6BgtIUxqDMJjEufF6gL?= =?us-ascii?Q?mauDqP2sSWZ/lLQQaN4SRPFAgvsHQWD7DIdwAR9DgMeEXSW+y1Z5TCrgRCv1?= =?us-ascii?Q?A5gUB60II/IMwZSfegOC617f+1/L2cTp4Xa9IN6pd4yamJlCQ/SC4GR+/IWO?= =?us-ascii?Q?Tyaa2pxrJxjEGlpeWyJAbZLCgJKbjWMLvbOnppXgmjrnua9tq5RDcQZ99hFX?= =?us-ascii?Q?QmH2x79JPXS2ZwNAsfjMNm9aaPVy2zkF+kTvov2xRZ8lyzRd+pteeue8G6Iq?= =?us-ascii?Q?dN/yF7imbxJYgvU8yf40Lz11r/3j1446QdBOSHhioY7C7tSascodA52WJC1O?= =?us-ascii?Q?VtAvsq4/1xe7fzQQTZn6t2DvMONVctZO/DxUQJ+vNZbXt/2UnrWVJWAuxaf7?= =?us-ascii?Q?TBa/QvY5MmQ9V292I+xNZT1r9RLUC1/OUoq5o910glDdiNU9ZPSIiOCadXE8?= =?us-ascii?Q?A9Drhr3xww=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: d607190c-3663-4966-bb11-08df152a61d5 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Sep 2026 02:13:08.5954 (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: yXH+TItg5mkCgHaQ2teDKNvXCZHj9YpyVmqN0KkawGOEYk81bkWQjQ97kK0box0OCLSxzGI2h0A7C7QXjFKuzA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB8015 Content-Type: text/plain; charset="utf-8" GSP-RM numbers its GMC events from bit 63 upward, apart from the driver's request numbers, and marks a response with a flag in the command word. The GMC receive debug line printed the raw sequence and labeled every element a receive: GSP GMC: receive: seq# 9223372036854775808, command=3DEXEC_GENERIC_BOOT= LOADER (0x10002), length=3D0xb0 GSP GMC: receive: seq# 0, command=3DGSP_INIT (0x10001), length=3D0x450 Print the sequence with bit 63 cleared, and label each received element an event or a response by the flag: GSP GMC: event: seq# 0, command=3DEXEC_GENERIC_BOOTLOADER (0x10002), le= ngth=3D0xb0 GSP GMC: response: seq# 0, command=3DGSP_INIT (0x10001), length=3D0x450 Assisted-by: LLM Signed-off-by: John Hubbard --- drivers/gpu/nova-core/gsp/cmdq.rs | 35 +++++++++++++++++++++++-------- drivers/gpu/nova-core/gsp/fw.rs | 11 +++++++++- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 2b53b1e6cebf..530ad51304ce 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -1062,10 +1062,17 @@ fn log_event(&self, function: Result, seq: u32) { /// Logs a GMC message that no caller is waiting for: a response to a = request that has already /// timed out, or an event that arrives outside the boot sequence. fn log_gmc_event(&self, header: &GspGmcMsgElement) { + let kind =3D if header.gmc.is_response() { + "response" + } else { + "event" + }; + dev_warn!( &self.dev, - "GSP GMC: dropping unclaimed message (seq {}, command=3D{})\n", - header.gmc.sequence, + "GSP GMC: dropping unclaimed {} (seq# {}, command=3D{})\n", + kind, + header.gmc.sequence_number(), GmcCommand(header.gmc.command_id()), ); } @@ -1268,13 +1275,23 @@ fn consume_element( message.header.function(), message.header.length(), ), - QueueElement::Gmc(message) =3D> dev_dbg!( - &self.dev, - "GSP GMC: receive: seq# {}, command=3D{}, length=3D0x{:x}\= n", - message.header.gmc.sequence, - GmcCommand(message.header.gmc.command_id()), - message.header.length(), - ), + QueueElement::Gmc(message) =3D> { + let gmc =3D &message.header.gmc; + let kind =3D if gmc.is_response() { + "response" + } else { + "event" + }; + + dev_dbg!( + &self.dev, + "GSP GMC: {}: seq# {}, command=3D{}, length=3D0x{:x}\n= ", + kind, + gmc.sequence_number(), + GmcCommand(gmc.command_id()), + message.header.length(), + ) + } } =20 let result =3D f(self, element); diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index 106d71f95fc3..ec474a175ee6 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -729,6 +729,10 @@ pub(crate) struct GmcApiHeader { /// Flag bit of [`GmcApiHeader::command`] that GSP-RM sets on a response. const GMCAPI_COMMAND_FLAGS_RESPONSE: u32 =3D 0x0100_0000; =20 +/// First sequence number of the space that GSP-RM numbers its events from= , so that an event's +/// number cannot collide with a request's. Requests are numbered from zer= o. +const GMC_EVENT_SEQUENCE_BASE: u64 =3D 1 << 63; + /// GMC request that carries the system information and registry keys to G= SP-RM. GSP-RM answers /// it with the static GPU configuration once it has finished starting. pub(crate) const GMCAPI_CMD_GSP_INIT: u32 =3D bindings::GMCAPI_COMMANDS_GM= CAPI_CMD_GSP_INIT; @@ -776,10 +780,15 @@ pub(crate) fn command_id(&self) -> u32 { } =20 /// Returns `true` if GSP-RM sent this header as a response rather tha= n an event. - fn is_response(&self) -> bool { + pub(crate) fn is_response(&self) -> bool { self.command & GMCAPI_COMMAND_FLAGS_RESPONSE !=3D 0 } =20 + /// Returns the sequence number without the bit that marks an event's = sequence space. + pub(crate) fn sequence_number(&self) -> u64 { + self.sequence & !GMC_EVENT_SEQUENCE_BASE + } + /// Returns the `NV_STATUS` that a response carries. /// /// The value is meaningful only when [`Self::is_response`] is `true`.= In a request, the same --=20 2.55.0