From nobody Mon Jun 8 09:49:06 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010010.outbound.protection.outlook.com [52.101.85.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 66A4733689F; Sat, 30 May 2026 03:10:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.10 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110612; cv=fail; b=oFAK4Y/rgRCUWqpCmiMCW9S3nxOaT7OLl/x2dbpSHoLJx9rdPvNJfF6vRX+EJEoP2bHYSHLMlZSC4G8ItwQXFGCBBxRLQSgFpE/kWeJqkFqRXk343brHA32RYk9AjfPTRL0TFHOH/qCRdNivJS+MfCl0YNfkMubJNBYYgRugnGM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110612; c=relaxed/simple; bh=A0B7x0M88aiqBVxq1DQpSmdVFrxRyXtbiQq9txwzx2s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=oZVVo4OQKpGONvVRzttKW2DRVpAfAGQSW1BBqUfaypaeLezlD3f5rHhLCHU5YH6qb85xzer7P3UU/hQhmim/nmDZzVXoW7mM3nu6YEoemdQyhPLaeXKksNVtKF42Y0pHED0oaMU1Jz+Eq2T1GOiGC6REGqPqHDNDB94U2XlcTRY= 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=B21K6ml5; arc=fail smtp.client-ip=52.101.85.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="B21K6ml5" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=hdwjE+NhusXSCY+P2SEE3Ex/SrrfJFVtGLluKGIpS/TC8fhfDttRm81ME/rkkqurd5M9R4EEVE2wv5PBhmVtIRKpyamXEj8p+M45Br34BoLCVQM06IdDkGc9D7Y3P4VUx50yv1Vl2DwPb06LoJpBunR/uiyHR6K+O3MJYVJqaJOB5L0VRBMGwRh76gsVijejv7kkrBylrfixkQzGBGYUhz8Vf3ZOHFGs/NKSu4oFY8DkCzsEdEWnANaNm8JawM7+r8+r88zbmbP9lNkQa3eoVNsIx6i8sfK9X7i42SXfxMbhRmxksrn0xEyHcciCCLY3yhZFpQGq56/kkEfX5THX6Q== 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=N1mGJPqK5B323OTwdC/dEd1FBq26ohgmp4fBVGjKlnU=; b=PE9JZz3c+u4MpY/TYT3KgQOx9p2rwQoRzwt4jqJ//ER1Bxm7VlUSxDkR1K5DvoVNBiQMJmAKCblrvBFRY8HW5r5XoddbRNcOZqE6MjhCJZLAFg51kJXRiPbtCPGcgBz9kpigLsY/9eJ/bKnTuhBS+0kvfIbNp7itU5yJwPv6+ywt8OhZkjC3WJTi2+0bEtcZxyURPU8+yydpkAMfMaRwycomm6xu36kZjAAf4EmMiWFdC9ieGxxjVJwmRc82x1T1d2Co1VzG6lcBShzge773rtaxJrvJLpSDmdlJmw5V1P7U9OkPS+Z36Hy3jiVbjhYjlmV4ygIvlRHMc29NaQPijA== 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=N1mGJPqK5B323OTwdC/dEd1FBq26ohgmp4fBVGjKlnU=; b=B21K6ml56411ZHEyEcpttAQ97x8AN0l70T1aKqXd7UGWQ8VmPb3kq/7jlpRjr6w5zZ5zAlafK5dhWkrqQ7tSQvmzWa9f7x8AD9vhcs6poPXQGPT16eiiEX2OcNUnU0ynSB5ID0seoreia6ViGJyRm14ZN7LZeRcxkPQbc0imhMVZo7COJcfSvqCPKqinKnHCgGXtc3qwy4Ue1SjZ3CwC52n9siOF41NhsB+8FZ+/TKc17oQyEBJ/RlUw31b7po1dM5xzvfvEVXlzm8A82VaTGz/BM7REpyN7SXwWjtBwaUpJDhSadsXPmaBZaEzZO4E1SPaTl4L3FVXnlMb/gazf8w== 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 DS7PR12MB5863.namprd12.prod.outlook.com (2603:10b6:8:7a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:09:57 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:09:57 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 01/22] gpu: nova-core: set DMA mask width based on GPU architecture Date: Fri, 29 May 2026 20:09:32 -0700 Message-ID: <20260530030953.740561-2-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0124.namprd03.prod.outlook.com (2603:10b6:a03:33c::9) 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_|DS7PR12MB5863:EE_ X-MS-Office365-Filtering-Correlation-Id: c5d74268-bd80-4d81-1053-08debdf8ed90 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|7416014|376014|56012099006|6133799003|11063799006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: 7Bt/3MMbRwvb4gJaN5PpxC8mLqUKBD8WMAdAZpW9ZYxoOrb9sClHKwp0QfFnkbO6BvbSHOjNAWN7vpJkb/rRMjsB99QlyQ1GJO0MAgXElvbVrwaotmJFwE21XXYNLX8sW3rrHlzBj+dT31AnXoOCUxDbB7HUZH8R9gN2/18mqGfLdjFecFSgF5P/lBbQmSM3eRRm5TFC0zTTzBiHSgr8TX2olyy5yFPTq+wZHMHasp6x6kIIppc62G8wtFIYHP9Jl6J9JFnC0fy+nQSkTqog09AmodeYCeHS2lirYEi31cmOW+6Gq5m+lrFFVgRs9RCqMfAoIGGefAV+g4X8CUhCwaB3xerfIUAFdmtS7+wRJWsSb5NOMhMdQLIqTEyiKR9YlVUouAoy/CnnkxBbymFzuT5Qj8HAV7ekKVIRkiLxO7aC6GwOt0H1CXzLo1fYVsQesEykp7u4gw8+8bHtAw2NRtY6p880Myzxf5JrJn6DiyIvokgJBRdYt3nqmTN/1Pd6FgWP5p/518wTkTdhBLARN8mcke13whVwVMSbmJf2+KahJnPknTbyRlZ53A38zghii/ayMO/vqph9TMej2b5OLiGPuVlKe7wf5mb5MY8WSQsXDy8gm+l7RlxzEkeL2WckSD18/NycROeb+/uWkNVrlMjk6khL8j++PIC1In5FTFeBnYctKSwAcjoy0L7B9wiR 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)(1800799024)(366016)(7416014)(376014)(56012099006)(6133799003)(11063799006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?T+PoDw3nKuWASsp3QlRGA9+Ju9HutIHEjoUSERUVIIDo45Efey40x21vi6iI?= =?us-ascii?Q?dUJMvoO07UQfLo/ZHVz2qTya95rwq8GjU0QFeDtDWrP9g3FPItE+5r1OVoke?= =?us-ascii?Q?7m+max5LLwTG0ORfOfLpcdAGwQk9y4ZYyYKnA1bStNYqkP1pp98UkVjUV2sz?= =?us-ascii?Q?SF5BEx4+kTXAREHMBP9/1DMF15AeZ3uHFIR3p1oh3576ntNkJdBaABYDUpaM?= =?us-ascii?Q?Z5Ua4CrXrPmu7dIy1yoXujdfEmwPMgCsq7joO35DOSRjEsQ+ATE0R/MZn9B2?= =?us-ascii?Q?MDiLVCtPEV8jzpH5zqZamQINNxhXVNc8jAfRoUbX3GvcUZuiT51OoJAIhfK4?= =?us-ascii?Q?0kk3mfqRX1ESWRt7yPdu7d68ANrV7c4mkM3HpLSikPLn17stFiZcLW8tFJ/1?= =?us-ascii?Q?siM0Bm27MVf3geSyDZ7U/olHfHXUMWw+moefCKipxtGAKi5qIrMHBt5m4AIP?= =?us-ascii?Q?FDur3xmAgzU7TSJEbHksM2sjxA61MSmlqjKcIJ6lojnDLEBPi6FsdAZb1Z/D?= =?us-ascii?Q?0TSHE6Qd19qSbPIPM5FBN1XNFharoDqwFZbimjAn7eF6uxbkFo8U/On4oIm6?= =?us-ascii?Q?QfoKCsjJ1xhD/Iz+UQu476dVkhQWzlkHpfCoB2jrGrPAcgb2m4z/m9hPzg7B?= =?us-ascii?Q?TqVF6TonxRXHuhsZDJ5TXb8u72QOvc5RIQzDhM0scm15zfgWrRFWpHpDhyI2?= =?us-ascii?Q?QXDiWDSFQfV1wg5udEeqS7pwXjD95e1BF3F11OE9tD1RIm+K7fD2lrp5MPo0?= =?us-ascii?Q?M6yrYdCEj5emRqA4lKm+1K9k2aFrkv/txGSh+ySUKJDIO0lp12NQUF/qK1jj?= =?us-ascii?Q?5oXsGsiSh6TgCvgP4XFIsfhPwW5FPzdqzhctG2MEqiIywf/nO1N+wKJugBId?= =?us-ascii?Q?0sVgatXeDfCL6GymCWLWt7KTlQZJDd+bNBWZyLDlkMPjxUb72dNX1Iq7BjEa?= =?us-ascii?Q?L+yMZ+U6FjUU1wcg2W7b6Wr0qJ9hEel3P9v66KVCZdT1vLA9U76PQXESgwR8?= =?us-ascii?Q?dlk13sNEbDCT2IAwWuR0lYjpM7A8OzR0OaGIDKSBsjsUglw2Z0itL4WoZkVK?= =?us-ascii?Q?MESbbZ6KELI7csXtsn05R34VbQtigtjHQbJ50bdMcIsAcpMUJtjFzRU+yHma?= =?us-ascii?Q?gRUxzOKSLvnCcM9m7n3FQm4Efsbke+3iQTUZH/yNdOrohVTnOfjSKLPJ6Gr8?= =?us-ascii?Q?S6I+Hjxj4K8bQMF4lzLpcY4WpzwDCgTtDmDpaaeYiylRpC+ANqH8oa0U+F85?= =?us-ascii?Q?pNTbYmNlCnZWYBx9SfrysM4qyL831uxo6KTHrZSHE4S6h9SkhUgqaTHF0Zq2?= =?us-ascii?Q?2Hte2mW3LPISNomoljFAP9+Efm0SuBCehKuDX3ijqFoictCfwrxf/ib0eNgZ?= =?us-ascii?Q?KxMXK4WciVM1eIWcNU8UMh3gvoWzmA4jjN/nVxWTmVqSXOl+QNTluAksIVZt?= =?us-ascii?Q?Uexoguyh/r0pTnupPvlPf+5R2iZqHfKvGyt6vfS+PzH2VWga2ufOR1vblbD2?= =?us-ascii?Q?wSMMZfU+Qm/dbgjBbXvDaolBQwLrXu4Ut1AMkwlQA8F+CoHoS8wRMflOVGnX?= =?us-ascii?Q?0dIfSg0GtJIX9qxtjNqTW6f89lGDMkcJ1aDe2KVJJbj0x+V0usDoeqBrqIOj?= =?us-ascii?Q?Q1wJKW12leJ9zBu+pFlqIOogjZhJQHH4GqQ67TNVe8SBn7hQvcmPJke125CI?= =?us-ascii?Q?jETpziEFhhM1KgDA53DXjoTaLFRrpCKIEt6SWReqM+dUhAJlbord+YxsReqT?= =?us-ascii?Q?BsXMgkRzeA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: c5d74268-bd80-4d81-1053-08debdf8ed90 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:09:56.9931 (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: 8WMc5R5EtKT2ZT+tr6Dh4b36kI40bb3Kd1RwZ43zkVyiHeZ/aapa/VthEovQlCdlXaN/O11Rg7DD1m4/OiRtdw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB5863 Content-Type: text/plain; charset="utf-8" Replace the hardcoded 47-bit DMA mask with a GPU HAL method that provides the correct value for the architecture. Set the DMA mask in Gpu::new(). Gpu owns all DMA allocations for the device, so no concurrent allocations can exist while the constructor is still running. Acked-by: Danilo Krummrich Reviewed-by: Gary Guo Co-developed-by: Alexandre Courbot Signed-off-by: Alexandre Courbot Signed-off-by: John Hubbard Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/driver.rs | 15 --------------- drivers/gpu/nova-core/gpu.rs | 12 ++++++++++-- drivers/gpu/nova-core/gpu/hal.rs | 8 +++++++- drivers/gpu/nova-core/gpu/hal/gh100.rs | 9 ++++++++- drivers/gpu/nova-core/gpu/hal/tu102.rs | 5 +++++ 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver= .rs index cff5034c2dcd..ade73da68be5 100644 --- a/drivers/gpu/nova-core/driver.rs +++ b/drivers/gpu/nova-core/driver.rs @@ -3,8 +3,6 @@ use kernel::{ auxiliary, device::Core, - dma::Device, - dma::DmaMask, pci, pci::{ Class, @@ -38,14 +36,6 @@ pub(crate) struct NovaCore<'bound> { =20 const BAR0_SIZE: usize =3D SZ_16M; =20 -// For now we only support Ampere which can use up to 47-bit DMA addresses. -// -// TODO: Add an abstraction for this to support newer GPUs which may suppo= rt -// larger DMA addresses. Limiting these GPUs to smaller address widths won= 't -// have any adverse affects, unless installed on systems which require lar= ger -// DMA addresses. These systems should be quite rare. -const GPU_DMA_BITS: u32 =3D 47; - pub(crate) type Bar0 =3D kernel::io::Mmio; =20 kernel::pci_device_table!( @@ -88,11 +78,6 @@ fn probe<'bound>( pdev.enable_device_mem()?; pdev.set_master(); =20 - // SAFETY: No concurrent DMA allocations or mappings can be ma= de because - // the device is still being probed and therefore isn't being = used by - // other threads of execution. - unsafe { pdev.dma_set_mask_and_coherent(DmaMask::new::())? }; - Ok(try_pin_init!(NovaCore { bar: pdev.iomap_region_sized::(0, c"nova-core/b= ar0")?, // TODO: Use `&bar` self-referential pin-init syntax once = available. diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index aed992488db3..38c75df77e16 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -2,6 +2,7 @@ =20 use kernel::{ device, + dma::Device, fmt, io::Io, num::Bounded, @@ -269,7 +270,7 @@ pub(crate) struct Gpu<'gpu> { =20 impl<'gpu> Gpu<'gpu> { pub(crate) fn new( - pdev: &'gpu pci::Device, + pdev: &'gpu pci::Device>, bar: &'gpu Bar0, ) -> impl PinInit + 'gpu { try_pin_init!(Self { @@ -280,7 +281,14 @@ pub(crate) fn new( =20 // We must wait for GFW_BOOT completion before doing any signi= ficant setup on the GPU. _: { - hal::gpu_hal(spec.chipset).wait_gfw_boot_completion(bar) + let hal =3D hal::gpu_hal(spec.chipset); + let dma_mask =3D hal.dma_mask(); + + // SAFETY: `Gpu` owns all DMA allocations for this device,= and we are + // still constructing it, so no concurrent DMA allocations= can exist. + unsafe { pdev.dma_set_mask_and_coherent(dma_mask)? }; + + hal.wait_gfw_boot_completion(bar) .inspect_err(|_| dev_err!(pdev, "GFW boot did not comp= lete\n"))?; }, =20 diff --git a/drivers/gpu/nova-core/gpu/hal.rs b/drivers/gpu/nova-core/gpu/h= al.rs index 788de20ab5d3..0b636b713593 100644 --- a/drivers/gpu/nova-core/gpu/hal.rs +++ b/drivers/gpu/nova-core/gpu/hal.rs @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-2.0 =20 -use kernel::prelude::*; +use kernel::{ + dma::DmaMask, + prelude::*, // +}; =20 use crate::{ driver::Bar0, @@ -16,6 +19,9 @@ pub(crate) trait GpuHal { /// Waits for GFW_BOOT completion if required by this hardware family. fn wait_gfw_boot_completion(&self, bar: &Bar0) -> Result; + + /// Returns the DMA mask for the current architecture. + fn dma_mask(&self) -> DmaMask; } =20 pub(super) fn gpu_hal(chipset: Chipset) -> &'static dyn GpuHal { diff --git a/drivers/gpu/nova-core/gpu/hal/gh100.rs b/drivers/gpu/nova-core= /gpu/hal/gh100.rs index 1ed5bccdda1d..41fbabb04ff8 100644 --- a/drivers/gpu/nova-core/gpu/hal/gh100.rs +++ b/drivers/gpu/nova-core/gpu/hal/gh100.rs @@ -1,6 +1,9 @@ // SPDX-License-Identifier: GPL-2.0 =20 -use kernel::prelude::*; +use kernel::{ + dma::DmaMask, + prelude::*, // +}; =20 use crate::driver::Bar0; =20 @@ -12,6 +15,10 @@ impl GpuHal for Gh100 { fn wait_gfw_boot_completion(&self, _bar: &Bar0) -> Result { Ok(()) } + + fn dma_mask(&self) -> DmaMask { + DmaMask::new::<52>() + } } =20 const GH100: Gh100 =3D Gh100; diff --git a/drivers/gpu/nova-core/gpu/hal/tu102.rs b/drivers/gpu/nova-core= /gpu/hal/tu102.rs index 08dd4434bd72..2881ab03dbcd 100644 --- a/drivers/gpu/nova-core/gpu/hal/tu102.rs +++ b/drivers/gpu/nova-core/gpu/hal/tu102.rs @@ -19,6 +19,7 @@ //! Note that the devinit sequence also needs to run during suspend/resume. =20 use kernel::{ + dma::DmaMask, io::{ poll::read_poll_timeout, Io, // @@ -80,6 +81,10 @@ fn wait_gfw_boot_completion(&self, bar: &Bar0) -> Result= { ) .map(|_| ()) } + + fn dma_mask(&self) -> DmaMask { + DmaMask::new::<47>() + } } =20 const TU102: Tu102 =3D Tu102; --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from PH7PR06CU001.outbound.protection.outlook.com (mail-westus3azon11010063.outbound.protection.outlook.com [52.101.201.63]) (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 A17393375CB; Sat, 30 May 2026 03:10:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.201.63 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110616; cv=fail; b=t/cYKItvxZMfxkRCOYM8/pgPtYK1X+01TPHaew12MMydi4nPg4rlQP4LfE1xzhJNul1oyr5AhCdEu/PsLQVCQ4rYBOFkN+3cV304THODmbqN5ys5tOCrLNNGwJjmB+pdOWuqlq3IR4tOKLBYiw7lngkIlSKa9M43wCiuMABB0/E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110616; c=relaxed/simple; bh=pbuziWFeA7MNaKNXb97DoYMWnN2l8NutMC+ZS1CuqCI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Wbp2ifeFxGBkhIeZeRMaWhbHZQVj3KKlZbaCtamajVRmej5YDKs9Hy4tsYVwgaJDlpNImHYgSOzueFFI9+jlH2dufVoXB1FoBq8zUARJ8CTgRhcsfPk3OqEEqVCeBmawoiutEiSZF1tkUCDPV5nsda+bVIirAd0pEtpqeXQlcJ8= 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=MWKUlP4e; arc=fail smtp.client-ip=52.101.201.63 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="MWKUlP4e" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MVkwlZo3bITbb1KmaiN9LYsmsJKx0kFWcL2Vu1xssPXVc9P7mBNyV/cSMhV01Gkj/Fcr9OlZjZvuTygz9OCNqZE0CdYdV4JgRcjNY9oRn+Gm/+TIi20ovGbinpbf3Jd7EfO8C/9gJunyPEZd8VLnqj0h0x5KSwZru7V5hnDPPBmd4/wq8RumefrdkVnlLxKvuBphLefcAQMiAJTDtBCEvrdvEz2IFKX6nmLffS4UStxUY/xeXECkzo653KkNvXhPs8MQU4mYwBXOeDmq7u8srj5zu0yZksnlkVYYmWMbGc2uNGhOHHpCokVf4vKHoOJjJwTfYt9r0BDZbZBj8p5fOQ== 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=yfTVN33zAiO7dO2q+XBSG4Vqi04JgtPW/HtREEynGfQ=; b=f65r2WGDtLN2bjAsjiRBUfArGYXEXSl7q5fpbuEN3m2BO8qsZuelAuk34MlrACGRPdho8aVXizMkXqJlokebnFGSsJTy6xlqPFPO5IHmJOYGMVDnWjIQrj2Ni1F1qZmAC6IGtSql5c0D3/QeGAUG+sLP1hMkzAW2mWGGPEP+JrKwSOKFm2jpkAkcnEYYBSHlUVDZiYxfT6RxK6qV3KgWSVrh+5f6NzjcL7ykhaFHarhFJj7wQArh+7BNx3jTagecpp+dT1X3Vdh9RpWeBNo14li7Olwn0akya7IJ8/hmPvZzctgL+5xr5LiPUagK16Ms0whckLzAdJMK7NFaz94JCw== 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=yfTVN33zAiO7dO2q+XBSG4Vqi04JgtPW/HtREEynGfQ=; b=MWKUlP4eFkD0HQI8UyTaaWLB4uKsevPP+SNryJvypBGovxD++oarmMebsaaIx61FAFqHTUB7jj5OtCAeerMXAmQkcmTrQ+saYsSjdVJGhLy3/vEGPB8B9qo0QE/ExJ5g4BMr3LUaJkkwitK3Srdti//txktj/FwNTcdk9C0RZ84AwHpk9trCiTeWqBB25jLZunBCuX2wE1EgMcfXrBETGpYRhwpWglUBQdxjhIYY828uJrIwjpY5708LQNH9hlSPP060HLd6J2IiW6DPYUwK1ExMFVjId4gpDhnejgdUmDlDsQ/ReBdqXAP8YIncZUAvdcf40y5/8XB4H0UPZE8iBQ== 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 DS7PR12MB5863.namprd12.prod.outlook.com (2603:10b6:8:7a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:09:58 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:09:58 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 02/22] gpu: nova-core: Hopper/Blackwell: new location for PCI config mirror Date: Fri, 29 May 2026 20:09:33 -0700 Message-ID: <20260530030953.740561-3-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY1P220CA0039.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:59e::7) 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_|DS7PR12MB5863:EE_ X-MS-Office365-Filtering-Correlation-Id: cd5e6521-ce94-4b86-e9b3-08debdf8ee5b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|7416014|376014|56012099006|11063799006|3023799007|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: selcomX2JhseZLyEfA4VvMmr1//iL2fhN6AyAgBPsfsFOgHa2WIhIvIBcgutxdcPwF71YfojG3fPiT0Rn17akL6kE2cbaLZLHtgzdd6SKhjHvajTQ9kuuIwbs2KBiwocp9e5fL6+T5Y1Mwjgwa2UYSquE2DUCezHwTCfcifVqTmEmesc+WUmB4cS2evvm3a1NeaflJNDqPtfsSt9fYmJl9slpWvLW6OrMtWYFcGtA7EHJf+MRanq4+yYUdD1ZIYAZ3DgQn6aqWJR2CxZJoXss3M6ngLKKcw8Oja0X8azMVukkD3C1/PstdiUhLAriCNlh/Af1KYzxYu7nqhpBYG0qEXuDaoOMJFJjG7uGGe49p71FeU7guiY4Gd5KIi4HnXkUUObZZP3M9RdDrisjWBEt9uizm0f+bPZM/s68IkRe1t1oZtZennSuaHh0yECfH9KaxKaDZT4shAjQvw33vATua5xlLVOo5p7yV/0IM2TzDlTbWZswEMIzaCu9bTbbp2BfK/z77lKxq0w/bznsor3/XoRThR6lvYLemobCBQ5TeImJzoPjv18GZN3JF/fI7TAVm3V+TMO4+q1otOVM0LD7SmWcG973aaHK7xyBm0E2st38wLKFAiD47uCg2VlUYMyqKzqoR5Di1G9WZ4rgGk8WLoNQBoyDuGTWkyCPkq9p4zaYg7I5IHj1gbP5DCyKDkt 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)(1800799024)(366016)(7416014)(376014)(56012099006)(11063799006)(3023799007)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?ksdk0JAUJuvpIcSJKZl8+tY+ZAvN/9AI2eQyY7RxIbcVsi3XVO7vd9TvdaP3?= =?us-ascii?Q?ZIeFueV2HezE+yJMZaI5eo1bZAqeYT9SnoLbq6Fic8SkTE5L27WZltonuBJl?= =?us-ascii?Q?4GINxaL1njTKcyi+jWO93pppWN239WlFxhXjyXxLXGO3C2KEicGa0qcBPh/q?= =?us-ascii?Q?IIdrB4piZ3psr6mNehOCi2CC/CTSetm8CyfAoPxh1cQrNLY1rD4OfnfqW8FZ?= =?us-ascii?Q?h+a8fiQ+bxiOrZ6Rw4jq69RFTYt0B2Zl202mAvX2CE8ImYA1pUfqV6q2QGim?= =?us-ascii?Q?1p8+VzVbBLDT3Gh8fEo8gPRlNSx0QDQHqtZDIaKTOYrRd5zwWHS4kp2YeKku?= =?us-ascii?Q?dZw4c5YECMHZHdIuDonfvDVYoMbQebSydOKe6wTvseAEYT3RUUVDvHVMY7GW?= =?us-ascii?Q?/N4IAB9l4JvuSho7mSASY7so0FkNAt162UCB89c4xn1AWpn56UGwyukAbdvu?= =?us-ascii?Q?wrxo4GZnJEdVOnOYPF4AnTrmCQBiR9R4AkdO9IczLWlPdZC9XNN4Rry8yFHO?= =?us-ascii?Q?BpGz3XCglHVqxUUlUzM0y1eE/FrdFQrIPqqs2TN82IpCS4m3iw7QkXf7MVKK?= =?us-ascii?Q?YYmkdwuTqqjUBclSYESbeOhpsCFnsm8Zv5022/LWR0sjltB2gymiOiAv5qm8?= =?us-ascii?Q?VfIuJhx7HNhdrQBshd53OKCVBGDMND0pCmtLe4fR2WI3xHWNk6JQusvC3lIy?= =?us-ascii?Q?bedOXhxLoBabjbtSRyF+XWl6yJIqdZUm3zbvjT88nVoXsGCEZzAywEqdbWiJ?= =?us-ascii?Q?t0YoZCQrDZPZ2gcDdqxfoDThdU2VZX2lEKX0W2yeIrknZIbKIneQg4Mf5iUH?= =?us-ascii?Q?emYTMsAMzgy8Hc8Qq0i/Pj4uIdrnBc9EbTeEBQSrD2GJTYtuDUA1j7oweI9X?= =?us-ascii?Q?RnLgzRGRgHmR5dWkaPevFphu6jfOyAMHQQ1Gn2ZoRRUNAypk7hPh/9qVor4O?= =?us-ascii?Q?I0AKgEF70e8mBWCVmOVf0Kx1W+I/5KGt3vJhVz5/YM23PuacePBbS9NQm6NY?= =?us-ascii?Q?29wD603WXazPgq4z0nKFtS6+QZzXoiyp9eM5XzXmXxw8vwlkir6V1vL1eCin?= =?us-ascii?Q?XIWGR+z6G0IZkkxpo32IeQNSt2yvvqt38BenNLAqAURZNtUfBcBrGX3anq76?= =?us-ascii?Q?+0jM76Jyteim7z7CuVD+ko5HhhpiLLltKnVP2r2mEoir6Z4fdgpSwlUJrCDY?= =?us-ascii?Q?a43n+aAwWDGY4KpBkQQ175/1Djc0eaC9bdlI9NfaV/kumFsu72r039VwMyxM?= =?us-ascii?Q?553/k1h9DwNUD5La0mld0hYldfdBzZ3fqzQ+nl95n3tvQsesKQbNIGItHJCT?= =?us-ascii?Q?SmLIesmXkk/CHo0u5x4V0o1zOPVMCLH/af6lUgnudDiRZR0Ngtn6Lpa+hi4j?= =?us-ascii?Q?q0ZraI3Kj38zpzsSWHSKg6NjA3OemNYiPptXRv8IcRw/fRYW9nvIu/jfz1eE?= =?us-ascii?Q?XKqfPguTzpdwY9SjccRRBCJbPdy6Mtd62lpg5FFAKrYOdkMIjmQXykp+e5bS?= =?us-ascii?Q?3kWh3y7n/lwSDCL/a1Itq6fV8wcTBko0JipeoZi0PykPycjyhpCMm1c28cuI?= =?us-ascii?Q?Ho2L1xs4NIODM8xW0cAsM4/EK/ubk1wfbygK7rbpnnwxMJ3wV9MnQYzk1i2D?= =?us-ascii?Q?F5Y+pAQRrhTABbnoJFJckmJ8CqGbxzCXkdl8YRsR47kEje10f4W5qu5Vf9Jf?= =?us-ascii?Q?xvez/c79ICamcNGIQ03v6s+C5LprneHIkLv25jLfYr6QvCdjyHs5AUK4tS6F?= =?us-ascii?Q?w8SeOWJVHQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: cd5e6521-ce94-4b86-e9b3-08debdf8ee5b X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:09:58.3033 (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: 4wiywAhyF94Qh7sAJOalqXKwgQuoGY6Oik0wE+P8IvUUE+q3G1tXTQiKLrndudJH8wq5/2imKgtq4Maq2k3n1Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB5863 Content-Type: text/plain; charset="utf-8" Hopper and Blackwell GPUs moved the PCI config space mirror from 0x088000 to 0x092000. Select the correct address per architecture when building the GSP system info command. Co-developed-by: Alexandre Courbot Signed-off-by: Alexandre Courbot Signed-off-by: John Hubbard Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/gpu.rs | 7 +++++++ drivers/gpu/nova-core/gpu/hal.rs | 5 +++++ drivers/gpu/nova-core/gpu/hal/gh100.rs | 9 +++++++++ drivers/gpu/nova-core/gpu/hal/tu102.rs | 9 +++++++++ drivers/gpu/nova-core/gsp/boot.rs | 2 +- drivers/gpu/nova-core/gsp/commands.rs | 8 +++++--- drivers/gpu/nova-core/gsp/fw/commands.rs | 15 +++++++++++---- 7 files changed, 47 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 38c75df77e16..7dd736e5b190 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -1,5 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 =20 +use core::ops::Range; + use kernel::{ device, dma::Device, @@ -134,6 +136,11 @@ pub(crate) const fn arch(self) -> Architecture { pub(crate) const fn needs_fwsec_bootloader(self) -> bool { matches!(self.arch(), Architecture::Turing) || matches!(self, Self= ::GA100) } + + /// Returns the address range of the PCI config mirror space. + pub(crate) fn pci_config_mirror_range(self) -> Range { + hal::gpu_hal(self).pci_config_mirror_range() + } } =20 // TODO diff --git a/drivers/gpu/nova-core/gpu/hal.rs b/drivers/gpu/nova-core/gpu/h= al.rs index 0b636b713593..cd833bd49b9b 100644 --- a/drivers/gpu/nova-core/gpu/hal.rs +++ b/drivers/gpu/nova-core/gpu/hal.rs @@ -1,5 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 =20 +use core::ops::Range; + use kernel::{ dma::DmaMask, prelude::*, // @@ -22,6 +24,9 @@ pub(crate) trait GpuHal { =20 /// Returns the DMA mask for the current architecture. fn dma_mask(&self) -> DmaMask; + + /// Returns the address range of the PCI config mirror space. + fn pci_config_mirror_range(&self) -> Range; } =20 pub(super) fn gpu_hal(chipset: Chipset) -> &'static dyn GpuHal { diff --git a/drivers/gpu/nova-core/gpu/hal/gh100.rs b/drivers/gpu/nova-core= /gpu/hal/gh100.rs index 41fbabb04ff8..17778a618900 100644 --- a/drivers/gpu/nova-core/gpu/hal/gh100.rs +++ b/drivers/gpu/nova-core/gpu/hal/gh100.rs @@ -1,5 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 =20 +use core::ops::Range; + use kernel::{ dma::DmaMask, prelude::*, // @@ -19,6 +21,13 @@ fn wait_gfw_boot_completion(&self, _bar: &Bar0) -> Resul= t { fn dma_mask(&self) -> DmaMask { DmaMask::new::<52>() } + + fn pci_config_mirror_range(&self) -> Range { + const PCI_CONFIG_MIRROR_START: u32 =3D 0x092000; + const PCI_CONFIG_MIRROR_SIZE: u32 =3D 0x001000; + + PCI_CONFIG_MIRROR_START..PCI_CONFIG_MIRROR_START + PCI_CONFIG_MIRR= OR_SIZE + } } =20 const GH100: Gh100 =3D Gh100; diff --git a/drivers/gpu/nova-core/gpu/hal/tu102.rs b/drivers/gpu/nova-core= /gpu/hal/tu102.rs index 2881ab03dbcd..125478bfe07a 100644 --- a/drivers/gpu/nova-core/gpu/hal/tu102.rs +++ b/drivers/gpu/nova-core/gpu/hal/tu102.rs @@ -18,6 +18,8 @@ //! //! Note that the devinit sequence also needs to run during suspend/resume. =20 +use core::ops::Range; + use kernel::{ dma::DmaMask, io::{ @@ -85,6 +87,13 @@ fn wait_gfw_boot_completion(&self, bar: &Bar0) -> Result= { fn dma_mask(&self) -> DmaMask { DmaMask::new::<47>() } + + fn pci_config_mirror_range(&self) -> Range { + const PCI_CONFIG_MIRROR_START: u32 =3D 0x088000; + const PCI_CONFIG_MIRROR_SIZE: u32 =3D 0x001000; + + PCI_CONFIG_MIRROR_START..PCI_CONFIG_MIRROR_START + PCI_CONFIG_MIRR= OR_SIZE + } } =20 const TU102: Tu102 =3D Tu102; diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index 087ee59da6d9..8c316fa2e585 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -144,7 +144,7 @@ pub(crate) fn boot( dev_dbg!(pdev, "RISC-V active? {}\n", gsp_falcon.is_riscv_active(b= ar),); =20 self.cmdq - .send_command_no_wait(bar, commands::SetSystemInfo::new(pdev))= ?; + .send_command_no_wait(bar, commands::SetSystemInfo::new(pdev, = chipset))?; self.cmdq .send_command_no_wait(bar, commands::SetRegistry::new())?; =20 diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index 3a365455d10c..f84de9f4f045 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -19,6 +19,7 @@ }; =20 use crate::{ + gpu::Chipset, gsp::{ cmdq::{ Cmdq, @@ -37,12 +38,13 @@ /// The `GspSetSystemInfo` command. pub(crate) struct SetSystemInfo<'a> { pdev: &'a pci::Device, + chipset: Chipset, } =20 impl<'a> SetSystemInfo<'a> { /// Creates a new `GspSetSystemInfo` command using the parameters of `= pdev`. - pub(crate) fn new(pdev: &'a pci::Device) -> Self { - Self { pdev } + pub(crate) fn new(pdev: &'a pci::Device, chipset: Chips= et) -> Self { + Self { pdev, chipset } } } =20 @@ -53,7 +55,7 @@ impl<'a> CommandToGsp for SetSystemInfo<'a> { type InitError =3D Error; =20 fn init(&self) -> impl Init { - Self::Command::init(self.pdev) + Self::Command::init(self.pdev, self.chipset) } } =20 diff --git a/drivers/gpu/nova-core/gsp/fw/commands.rs b/drivers/gpu/nova-co= re/gsp/fw/commands.rs index 42985d446bae..7bcc41fc7fa0 100644 --- a/drivers/gpu/nova-core/gsp/fw/commands.rs +++ b/drivers/gpu/nova-core/gsp/fw/commands.rs @@ -11,7 +11,10 @@ }, // }; =20 -use crate::gsp::GSP_PAGE_SIZE; +use crate::{ + gpu::Chipset, + gsp::GSP_PAGE_SIZE, // +}; =20 use super::bindings; =20 @@ -25,8 +28,12 @@ pub(crate) struct GspSetSystemInfo { impl GspSetSystemInfo { /// Returns an in-place initializer for the `GspSetSystemInfo` command. #[allow(non_snake_case)] - pub(crate) fn init<'a>(dev: &'a pci::Device) -> impl In= it + 'a { + pub(crate) fn init<'a>( + dev: &'a pci::Device, + chipset: Chipset, + ) -> impl Init + 'a { type InnerGspSystemInfo =3D bindings::GspSystemInfo; + let pci_config_mirror_range =3D chipset.pci_config_mirror_range(); let init_inner =3D try_init!(InnerGspSystemInfo { gpuPhysAddr: dev.resource_start(0)?, gpuPhysFbAddr: dev.resource_start(1)?, @@ -36,8 +43,8 @@ pub(crate) fn init<'a>(dev: &'a pci::Device) -> impl Init To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 03/22] gpu: nova-core: Blackwell: compute PMU-reserved framebuffer size Date: Fri, 29 May 2026 20:09:34 -0700 Message-ID: <20260530030953.740561-4-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY1P220CA0045.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:59e::14) 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_|DS7PR12MB5863:EE_ X-MS-Office365-Filtering-Correlation-Id: e14dd232-564e-4669-eaf0-08debdf8ef2e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|7416014|376014|56012099006|11063799006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: RWJkl+ujYrairpCAott/wg8NPdukfkYtAzuQUhHlY7/i71lBVNtCcxINAwbZsmYL5qrVCR+bD6RMjh7EmlHgqC2NNmn0Pr4ZNNP2QduGouskaoWynmz2WaWqUZ4NyLnLbnfkKoSmj6rWYT52Rm2jDyhadMWIb8QxqWk0M+9Onr03pJs7X6BqNhfa7eo1He0J5Jn09hvPTgX3edWtgqU/bAr6Hp2OIQD2766f4E6cYwlqvSu+X6PwrTNz/J2lxLQXZ+Ho+eY1U8oNqJ8/Rl7m3xMab2usf35TLUroQz/8TXUtJYV4k9vsHMp9K0JeakFDZjaGXz1R6z5Lw/2sgCoyjnvyP4x5nly13U4PDKj1W7jztyUKMwMTnytwMsBOlhDxgRUnNTJRgTey6qiyMcD0FcMktbJgyjhUWBDOp/Z7X/4T0HCEY2hvFa6M5lJe7jIx5yIxSdVzahkN1ueH4GgffurDQVND8/C322Q6gp+s7RGjO/qrSLSalWLrFxw4Bwj/8IJPHRkNyBzILzJBxuVTHzQplAMofInv9lhOe90bh0dloorRAcS3hKftOCR04FH1XpvpfgI9zB3yl2aJJynehD1nJQRQxkmXy2/gABPXDG7BzjlsUfPdhvwVKk4Jou62foQJLq5EFk4VddN8m+dF6sQ5FYMFs0FM8fzLjA4Q+gabFISuPqSyW8j5AA3f3Xge 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)(1800799024)(366016)(7416014)(376014)(56012099006)(11063799006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Kdwv6xIKXK7C/R3zbQ2Zxv9NDhOzsxJJ3bFLBRCd8eUjlLcdPCrioNh6dZ23?= =?us-ascii?Q?3tExjBNCZrkdJEx1IBsGkpETCtUvG984xuHceuQM5/9qjkJQ5sFUvTCSCmdB?= =?us-ascii?Q?MvSNVS65GNhjtubVeESu3DENgrwvbLky4YiFB2S7jIOVr1i1O7UQcWbP0rFB?= =?us-ascii?Q?4wvwGo6Ka0cPsEJPHii4DOZOtOTBr/7zCMwf2Ja7BO0j2sz5t9+A7FRUpNY9?= =?us-ascii?Q?q5hGnSPjj7thYhw5EFWT7dGm2vzTWNBXnuqSn2aPMZa5//aUBRypaHD7txvM?= =?us-ascii?Q?Hdgo3xhj4NaNKLVUOqiKr9ShmPnUV7FTgwKdkBjhxyBuu9RRpbPrG+1P6mXU?= =?us-ascii?Q?B/Dfslhvgt9tJWkKomYawiBGrw6cc1s21q0X+jNZsmQk2C1AHEF/WNyxEK3v?= =?us-ascii?Q?dwfG3hxcZRsuUJoEsIvaP/4muvVi+TTQVeVw13sW1gm+4NpP7D+IRvtxI6zS?= =?us-ascii?Q?3G20M+zusKEP+tk2G6QG3ZEcvKmF+jI5s+zvU0RNi2xdlbp1PYXjx5NEEvip?= =?us-ascii?Q?XdA6Oy97WbGEPvjP2XIXGqt2H7waMyRAdzS9GlN/9/86ZOrp1VVn6zMvbxlb?= =?us-ascii?Q?oV54UTTmbNJHvqRZfsEm8euiRppVAyyNDVb3picXxixTKre3ifzz5xhqJqZH?= =?us-ascii?Q?KSbmhzW/p+4MA+LD5HFcy0HDaw2F1SKwKg6BQYQdYZeJCy/I9h1q9RP62One?= =?us-ascii?Q?hQsKnuzYF+1p/sn0bYLE45emL5DoBTq1blkl7SdpdIMTYqOItzQC7cVl3Qqu?= =?us-ascii?Q?CS7ynKsEZ9kxUkCzOc8+H3qhB293YIDE1EJUeH3rDtlbXMUWckmBKYMdtFQX?= =?us-ascii?Q?rhajcKQNpiEWPhSo/i5EhqYqDQ7M5kq5QQa7dTrbGmCd16bJzwydVm1Qc13/?= =?us-ascii?Q?zRVceMI7fQgeVjs724VQ/yjNpL+BnehEKenivNQsEjCs6rytJYSIEmQIYkl8?= =?us-ascii?Q?/Q5tc/9nPuLuOANDyz9l6wZp0O0vg0e5peqHoQ7INeQudzxEO5dVCWe4Fa6r?= =?us-ascii?Q?DAIU5cFxwGL3ucWWEVXPc/odAgDExJkXp1/2639BGjGueBrzTiuRsGpgbRgY?= =?us-ascii?Q?XEaB5XqLWOqYgjofvMd3TUwHDVBSB7A0lp/GXfurH0UDUNWJI9oR9/xwn99R?= =?us-ascii?Q?14YyXlz8B1cMV2ezwEUaM6QLZFp2TvVfI4WNP2iPYeaZwePA8ruS+/9FL/t0?= =?us-ascii?Q?+bQJhdRQcDOdFtrxbpr3H/DkVwJUkL0YNcRdOvoz9c/IuS4aki3/xCCNlRXz?= =?us-ascii?Q?Bw8nzw7iZtvPxpBQtThtCG/49xKO09U1Z+tvQk5lKWXsnbOPJP3xZ8UwlqYe?= =?us-ascii?Q?onpJa3yWxcWbdaBYkod7A2PviomRUt+8cw0wkg4iC0VZW9BPE36tCzcrIN/s?= =?us-ascii?Q?GQyzz9imMPAcW0amZVEL4AdyKMJisjz3qHJ74ERrdu2D9lQypFdX8ZIblK+Q?= =?us-ascii?Q?XAjFRr1/jGx+geg+L6e7b8ec6bJGyhRhb+8yVTn5cK/SZVAd5nq8cYlCofvy?= =?us-ascii?Q?OH3/2Oqrqp/LNYfvYkUfkY9jt8MkoAJlyf8bStJjPVsBYUNW3+dmdaLeTbYD?= =?us-ascii?Q?vs5ZuQjGuox81eKm7/xZof4kYTsajbJ0Epy2UKfFeF3PZkAvZOfv2uZaV2Qe?= =?us-ascii?Q?iso47lYI1rW9vJdYYrA9bXSj3A/euCdiCg8dQPAG9Y+HiL1xNc6BAMqoKLmV?= =?us-ascii?Q?zmTksgN5x3T9GYsM0NRXKIFzzBLIlLH6dqTh0zigfHfOQaa/vNIRK9KkORpA?= =?us-ascii?Q?mR3HQCr0Gg=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: e14dd232-564e-4669-eaf0-08debdf8ef2e X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:09:59.6755 (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: 2QvSa7aK8QV1bmc4d/8FBBXGGtRyHbOcwbR4xwRgJKaIXhcZPp/uzfrdB0yRcSHCjQ93HBFxL3G7aQQd5TVCRg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB5863 Content-Type: text/plain; charset="utf-8" GSP boot needs to know how much framebuffer memory is reserved for the PMU. Compute it per architecture: Blackwell dGPUs reserve a non-zero amount, earlier architectures leave it at zero, matching Open RM behavior. Co-developed-by: Alexandre Courbot Signed-off-by: Alexandre Courbot Signed-off-by: John Hubbard Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/fb.rs | 3 ++ drivers/gpu/nova-core/fb/hal.rs | 14 ++++--- drivers/gpu/nova-core/fb/hal/ga100.rs | 5 +++ drivers/gpu/nova-core/fb/hal/ga102.rs | 7 +++- drivers/gpu/nova-core/fb/hal/gb100.rs | 57 +++++++++++++++++++++++++++ drivers/gpu/nova-core/fb/hal/gh100.rs | 42 ++++++++++++++++++++ drivers/gpu/nova-core/fb/hal/tu102.rs | 9 +++++ drivers/gpu/nova-core/gsp/fw.rs | 1 + 8 files changed, 132 insertions(+), 6 deletions(-) create mode 100644 drivers/gpu/nova-core/fb/hal/gb100.rs create mode 100644 drivers/gpu/nova-core/fb/hal/gh100.rs diff --git a/drivers/gpu/nova-core/fb.rs b/drivers/gpu/nova-core/fb.rs index 1fb65d4eb290..d7a4dc944131 100644 --- a/drivers/gpu/nova-core/fb.rs +++ b/drivers/gpu/nova-core/fb.rs @@ -165,6 +165,8 @@ pub(crate) struct FbLayout { pub(crate) wpr2: FbRange, pub(crate) heap: FbRange, pub(crate) vf_partition_count: u8, + /// PMU reserved memory size, in bytes. + pub(crate) pmu_reserved_size: u32, } =20 impl FbLayout { @@ -265,6 +267,7 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw:= &GspFirmware) -> Result< wpr2, heap, vf_partition_count: 0, + pmu_reserved_size: hal.pmu_reserved_size(), }) } } diff --git a/drivers/gpu/nova-core/fb/hal.rs b/drivers/gpu/nova-core/fb/hal= .rs index 8b192a503363..e6ac55bba9b9 100644 --- a/drivers/gpu/nova-core/fb/hal.rs +++ b/drivers/gpu/nova-core/fb/hal.rs @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AF= FILIATES. All rights reserved. =20 use kernel::prelude::*; =20 @@ -12,6 +13,8 @@ =20 mod ga100; mod ga102; +mod gb100; +mod gh100; mod tu102; =20 pub(crate) trait FbHal { @@ -29,6 +32,9 @@ pub(crate) trait FbHal { /// Returns the VRAM size, in bytes. fn vidmem_size(&self, bar: &Bar0) -> u64; =20 + /// Returns the amount of VRAM to reserve for the PMU. + fn pmu_reserved_size(&self) -> u32; + /// Returns the FRTS size, in bytes. fn frts_size(&self) -> u64; } @@ -38,10 +44,8 @@ pub(super) fn fb_hal(chipset: Chipset) -> &'static dyn F= bHal { match chipset.arch() { Architecture::Turing =3D> tu102::TU102_HAL, Architecture::Ampere if chipset =3D=3D Chipset::GA100 =3D> ga100::= GA100_HAL, - Architecture::Ampere =3D> ga102::GA102_HAL, - Architecture::Ada - | Architecture::Hopper - | Architecture::BlackwellGB10x - | Architecture::BlackwellGB20x =3D> ga102::GA102_HAL, + Architecture::Ampere | Architecture::Ada =3D> ga102::GA102_HAL, + Architecture::Hopper =3D> gh100::GH100_HAL, + Architecture::BlackwellGB10x | Architecture::BlackwellGB20x =3D> g= b100::GB100_HAL, } } diff --git a/drivers/gpu/nova-core/fb/hal/ga100.rs b/drivers/gpu/nova-core/= fb/hal/ga100.rs index 2f5871d915c3..0f5132aa9c31 100644 --- a/drivers/gpu/nova-core/fb/hal/ga100.rs +++ b/drivers/gpu/nova-core/fb/hal/ga100.rs @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AF= FILIATES. All rights reserved. =20 use kernel::{ io::Io, @@ -67,6 +68,10 @@ fn vidmem_size(&self, bar: &Bar0) -> u64 { super::tu102::vidmem_size_gp102(bar) } =20 + fn pmu_reserved_size(&self) -> u32 { + super::tu102::pmu_reserved_size_tu102() + } + // GA100 is a special case where its FRTS region exists, but is empty.= We // return a size of 0 because we still need to record where the region= starts. fn frts_size(&self) -> u64 { diff --git a/drivers/gpu/nova-core/fb/hal/ga102.rs b/drivers/gpu/nova-core/= fb/hal/ga102.rs index 3bb66f64bef7..17a2fef1ad44 100644 --- a/drivers/gpu/nova-core/fb/hal/ga102.rs +++ b/drivers/gpu/nova-core/fb/hal/ga102.rs @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AF= FILIATES. All rights reserved. =20 use kernel::{ io::Io, @@ -11,7 +12,7 @@ regs, // }; =20 -fn vidmem_size_ga102(bar: &Bar0) -> u64 { +pub(super) fn vidmem_size_ga102(bar: &Bar0) -> u64 { bar.read(regs::NV_USABLE_FB_SIZE_IN_MB).usable_fb_size() } =20 @@ -36,6 +37,10 @@ fn vidmem_size(&self, bar: &Bar0) -> u64 { vidmem_size_ga102(bar) } =20 + fn pmu_reserved_size(&self) -> u32 { + super::tu102::pmu_reserved_size_tu102() + } + fn frts_size(&self) -> u64 { super::tu102::frts_size_tu102() } diff --git a/drivers/gpu/nova-core/fb/hal/gb100.rs b/drivers/gpu/nova-core/= fb/hal/gb100.rs new file mode 100644 index 000000000000..c78027c26a9e --- /dev/null +++ b/drivers/gpu/nova-core/fb/hal/gb100.rs @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Blackwell framebuffer HAL. + +use kernel::{ + prelude::*, + ptr::{ + const_align_up, + Alignment, // + }, + sizes::*, // +}; + +use crate::{ + driver::Bar0, + fb::hal::FbHal, + num::usize_into_u32, // +}; + +struct Gb100; + +const fn pmu_reserved_size_gb100() -> u32 { + usize_into_u32::<{ const_align_up(SZ_8M + SZ_16M + SZ_4K, Alignment::n= ew::()).unwrap() }>( + ) +} + +impl FbHal for Gb100 { + fn read_sysmem_flush_page(&self, bar: &Bar0) -> u64 { + super::ga100::read_sysmem_flush_page_ga100(bar) + } + + fn write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) -> Result { + super::ga100::write_sysmem_flush_page_ga100(bar, addr); + + Ok(()) + } + + fn supports_display(&self, bar: &Bar0) -> bool { + super::ga100::display_enabled_ga100(bar) + } + + fn vidmem_size(&self, bar: &Bar0) -> u64 { + super::ga102::vidmem_size_ga102(bar) + } + + fn pmu_reserved_size(&self) -> u32 { + pmu_reserved_size_gb100() + } + + fn frts_size(&self) -> u64 { + super::tu102::frts_size_tu102() + } +} + +const GB100: Gb100 =3D Gb100; +pub(super) const GB100_HAL: &dyn FbHal =3D &GB100; diff --git a/drivers/gpu/nova-core/fb/hal/gh100.rs b/drivers/gpu/nova-core/= fb/hal/gh100.rs new file mode 100644 index 000000000000..c122ac2091f8 --- /dev/null +++ b/drivers/gpu/nova-core/fb/hal/gh100.rs @@ -0,0 +1,42 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +use kernel::prelude::*; + +use crate::{ + driver::Bar0, + fb::hal::FbHal, // +}; + +struct Gh100; + +impl FbHal for Gh100 { + fn read_sysmem_flush_page(&self, bar: &Bar0) -> u64 { + super::ga100::read_sysmem_flush_page_ga100(bar) + } + + fn write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) -> Result { + super::ga100::write_sysmem_flush_page_ga100(bar, addr); + + Ok(()) + } + + fn supports_display(&self, bar: &Bar0) -> bool { + super::ga100::display_enabled_ga100(bar) + } + + fn vidmem_size(&self, bar: &Bar0) -> u64 { + super::ga102::vidmem_size_ga102(bar) + } + + fn pmu_reserved_size(&self) -> u32 { + super::tu102::pmu_reserved_size_tu102() + } + + fn frts_size(&self) -> u64 { + super::tu102::frts_size_tu102() + } +} + +const GH100: Gh100 =3D Gh100; +pub(super) const GH100_HAL: &dyn FbHal =3D &GH100; diff --git a/drivers/gpu/nova-core/fb/hal/tu102.rs b/drivers/gpu/nova-core/= fb/hal/tu102.rs index 22c174bf1472..1755bbc27866 100644 --- a/drivers/gpu/nova-core/fb/hal/tu102.rs +++ b/drivers/gpu/nova-core/fb/hal/tu102.rs @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AF= FILIATES. All rights reserved. =20 use kernel::{ io::Io, @@ -39,6 +40,10 @@ pub(super) fn vidmem_size_gp102(bar: &Bar0) -> u64 { .usable_fb_size() } =20 +pub(super) const fn pmu_reserved_size_tu102() -> u32 { + 0 +} + pub(super) const fn frts_size_tu102() -> u64 { u64::SZ_1M } @@ -62,6 +67,10 @@ fn vidmem_size(&self, bar: &Bar0) -> u64 { vidmem_size_gp102(bar) } =20 + fn pmu_reserved_size(&self) -> u32 { + pmu_reserved_size_tu102() + } + fn frts_size(&self) -> u64 { frts_size_tu102() } diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index 33c9f5860771..919d3ab00075 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -247,6 +247,7 @@ pub(crate) fn new<'a>( fbSize: fb_layout.fb.end - fb_layout.fb.start, vgaWorkspaceOffset: fb_layout.vga_workspace.start, vgaWorkspaceSize: fb_layout.vga_workspace.end - fb_layout.vga_= workspace.start, + pmuReservedSize: fb_layout.pmu_reserved_size, ..Zeroable::init_zeroed() }); =20 --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from PH7PR06CU001.outbound.protection.outlook.com (mail-westus3azon11010063.outbound.protection.outlook.com [52.101.201.63]) (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 9E93F346784; Sat, 30 May 2026 03:10:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.201.63 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110629; cv=fail; b=UUTueeJ8PjSonsTeVA3qBy8NQ6vh16SyrVDc4f/GvCLczWNPnSpTbALImfaWdnIwVOwU7wpTouBsOG5ZnuOQnHldamSp5S06CZEldDwS5XYZX5BNsIGjyf2vk5HGeh8msSFHwQwLTz9LINAq8qT7tDOUfhypsI9FWxAUqqUqk2g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110629; c=relaxed/simple; bh=2Itq6L8CtYgyL77jtUalGlvFBfY+yxFI0UbF4F++wfo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=rut2Ixs0DrAeABPtsPcjeoTT/zszkuJS5iRsHAeKGFPWg4qHx6fCo0cstAr6FKEI8WHLkdcjgBaVOYpxg3YvE7wnSQwzbvWK4EITo2zEIgbpJTm4wf4n7EcSwBsqKxpdZ9XIDmzihhvwq/Vlx0Yt+xyYUnwycmuP+SM/UPfGV98= 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=cnvpovUH; arc=fail smtp.client-ip=52.101.201.63 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="cnvpovUH" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=IO9PizI8OvrN2gwSHeoJXndoRMtQqxbMWcomaleDUVlTbR/aHLMWQXrdocqihV/0wJbmXKNOdzypwy0+lJMkhJVn8BPyKKI4O6dWS1ePVu8kFaudylW4wnIVCkimRlugqPEYx1Sbp5hWHjGmZvAeBtrzq7LQpJ/yNTmaTUZPC07WJcn79Rc0jhBluq1oJe/S+nF/5XQszulx3FCgpVi2NKWAz1F0sZStlvU0o734/F90371ULgVLgPC6dvUBbP5kW1aYFAfs1cBOYGPs13dq19YJpUS/f0FNAskFoTBBqChVbq5EgswywSi6mkQKAY7DvFALX6qUEonCumSiQLn0jw== 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=cyNVCk2kDzZCTv2PZF2eIyhr/pvfyUezkj6zO1/kpS8=; b=LwSCJDGA90rqpanIqJrQ/ofsQHLaK4eBeMqQlfRZubNr/hnwCasYxBpnjIZOKUB9mICCGVu310uy/LJgtwYkzVkJUEcd4J432nmpnqgQi+JLihMdBxngcry8D6N9eVm+FPWgjl1MAnQ7EZp6kaYfDoM6GkaPwo4KdbKaneRBBFiOkzOm6Iu616dgNU+NQpbuLqq1Og4jGYnIMYlGTlv7AW2TH/C8VOiJdb0hRz6/JIO5t7ieYRgzYyUFLSrXB7S5qaJDTUdrBnnJFDSTSj665H7Vc7mWbAySJc3Wuy+QYnKgZgiIqT6krfBzVnYMCH1WjcEobZceqCxHswlV7vfLrw== 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=cyNVCk2kDzZCTv2PZF2eIyhr/pvfyUezkj6zO1/kpS8=; b=cnvpovUHP3BU+yIVs9C/KE5INXdHuTVfeYl1UaFR0e1MScQHdTLJDah1MgBsY+xjuwjbH45jd4QfhzB1ya9Y01ML4YZQ/lglTeH3qi4CSs/ejG8xsxyGI1bwq7ra3FvDsJoQnJOSjPi8jEule05JqKOU6JsMPRMYPRQrzWmnmSoAucDr245sT1D47DiKXjTqwyXvRsMO8fGM0/MTU2fQlIkRUPYNnmwyxdwrIhoXWlNGPAyp5mOZRisaszuq5dYj8jyyJwANhdNWAz4NnUmXgbc8MicrTiMDvVj1qmffMsVnj4Q/ywnpkDdp5YSJsWrIUamgdgpZu/ZDha92LTVHvw== 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 DS7PR12MB5863.namprd12.prod.outlook.com (2603:10b6:8:7a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:01 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:00 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 04/22] gpu: nova-core: Hopper/Blackwell: larger non-WPR heap Date: Fri, 29 May 2026 20:09:35 -0700 Message-ID: <20260530030953.740561-5-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY1P220CA0049.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:59e::15) 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_|DS7PR12MB5863:EE_ X-MS-Office365-Filtering-Correlation-Id: 5158ec5f-6ecf-45c9-0d78-08debdf8efe4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|7416014|376014|56012099006|11063799006|3023799007|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: HWx5fLPy13x2PWTV6Hgqq/AVWRZipsopp9AI52ExiWt6L6roRZpVJBG4HgPw7YCa/ji+84brB7gljpSKLWP5nKF8rZwBXvXuW6fp6M9xktFaaIDd0RJgA6dBfCBw0ybFSrO7+iRneZnpOD55D5GQ/UAVh+MzTCN93FsFPdqMuU4aJDYZL/xmDj5hhOccrIVTMT1roRzfBrCZjY4+VdPnxiV4MFxXCRxJ0cco+lexrfgzwmR8CYZiCktKdNz8CYaMgvZPkIlWMyeKZ1atb0unuGstQ0kqLxkTLxVK84H326YERgxwuYxtdVL6JLFBaz1HkhaPFRCT54tos6bPBYM6P7O/aENpss87jnydhZGN7oZaHSl8FyvsxII0zXCaWOeExmSvce0boasELOSkwnYB09hpQE6aHdocnKwh3IgAG9uXslL8EyH2pSQx6gzEB6Uih9wzk3y5YBWEYJFfHKoPQk8VhJmoKk/KbHrCF2SdaSGymnPT557Q7GL/fqktRT8fVFn0D+dHuqjR/l2tSH76AzgocBhsxbq3ACW22FQS7tTlXrSrEex6FHvsynfRi5p/Nt+KF/MxyTHo53nrZrd30ej5LBgqU62pqgz5QRCd0jutWhdRm81OucSj0lHPNxmlD6/lJQt5abSvdpu42EXznnzyLdgeLGX/Asm/UdjpZZ0rfJfFF+LWqFLi/3Bs9dXc 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)(1800799024)(366016)(7416014)(376014)(56012099006)(11063799006)(3023799007)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?zVYe98KbDG16VmG52UbNHIwsIBtN6UiaHJRm/k2iE91CQeNyW5JfdjgGWCe0?= =?us-ascii?Q?M1knlXA/Fk64E5L5VjkMR8LUjFPxi5QWbg5eqnzbswmFziRS5uqnYjqGm14U?= =?us-ascii?Q?OCJHn5H9hRZ5Go8bjHiYZXec4sHgCv1hUS7mCbIv7676VPO9grBxPjgvucUq?= =?us-ascii?Q?XN+Yni2bYOPSJZrKGTPTFlH8tYfgWpMbLlRhP0lz4V10bdZzEbLnIBbl4Nju?= =?us-ascii?Q?RLGoh6N2ThozX23bjzSuhdT5HIGzWk9qktmnOu9EnrPIPn8VqYcu4Bz7wbW4?= =?us-ascii?Q?YEOscs/t7eUXR6kbBTn6jjbRm620D1WsBGLhzKUyml1alCKQAazix2xWrT0d?= =?us-ascii?Q?G8nQpSwc/t/l55pLhDB9jCCa4Kl5Qgqi1xpfk6ICFIYlogK0IHCdJPWSUAmO?= =?us-ascii?Q?MheIEtOdOfoEmT6FOQyejVeaVCgac30orqzapx5ytVjI/S8v205lP/hmQMGN?= =?us-ascii?Q?NJhvvkDxhdRYazcLVAKXXZAz8wSI7c3hQLP4glQU8/9+ZHvkXdsDth1eS21p?= =?us-ascii?Q?f3Gz50cG2JcO3E8kyaOueTf0B3GYtTD2JQw7dZq1Es4dQMEaBD7aqDKcXKVe?= =?us-ascii?Q?ACUpPBLqLd0YcVbVqWQYcbWRpWd/y2kvHOYbjpybmdcDmF3qZNa/OiD3cRk8?= =?us-ascii?Q?ZxbTUyhtyH/NdPaJwVZQzdtY2roEfSR1NZe4Dm/9MW0wQiLD5/1ho6q8lF81?= =?us-ascii?Q?2rm8c43xsjiH2uHoBFutT7+vwKIuTeYoTYfCvh5b63ND00ajkewZe4rHaIw7?= =?us-ascii?Q?sW45Ui9ngkor9921DSIS8yct6sAPPKlB5Kaxgod6m3pL9tZ1j2EFCrLcrEZH?= =?us-ascii?Q?SDx6uiCoErPwF2O0REgVP4zu6tH0Ue9yAL5CCgObOl93NxLSoafjWYV2EhhD?= =?us-ascii?Q?Cu3AAu6kkyWF9FzI1/EYirN4GzN5UmW1ZOaGnTX2waG5z3v4ilcvBhfd2maS?= =?us-ascii?Q?9t6W+AMkepQSUo9lffBX/rTG4FWQmcs9UKeooYA4Tro3lB43GpXlarGfb7l8?= =?us-ascii?Q?pTK+PhnhS0NjlMOBDzxvhduQfsnJPOGaSgh5D79oBuA4Af9BHOxR4r5wPtLg?= =?us-ascii?Q?FaXnXRF2o1ow8k9f5OJzyj54rGBBKvHeklrevi7iCoNBfeJgqPD+tg4UUrBg?= =?us-ascii?Q?G2pnR0MIHgGrwtqA1c3bTuGLzuFsSoN0ClMR+REHwV9TWABa5XSz4XkDL7nY?= =?us-ascii?Q?Lkqr0lcqc5r4ydQEztT4lvbu5eho0P5El++eQe/v2pNWlMVfFQ0gbv4cgMsv?= =?us-ascii?Q?iBzgNIR4EMMi71IuWX3eDxqg0Y6SDt+P41uy382ehA3NENs1Kjyru1f3LexZ?= =?us-ascii?Q?pWPTBHepVYN04HQ+PXmyphKua9TXuNILypUzgaeg+WrCzKt6L2lTn2XDi5nt?= =?us-ascii?Q?ZGWsRzat+L0EcAIqIomYU/6MQVB40fWlWJ3ulkolcHXC/6WJ4EbEr7/UWLH0?= =?us-ascii?Q?l3Pubm6LrB2kBsDdjMBbfPw+X62D6ZsxKofJ+5LPT5i0rVj9uFgZX9tY+kUf?= =?us-ascii?Q?6q7IAv6oUEZTGgikgXLW5MfWqKscRRrVqITmJt7hXEy4oGsyZjyYKCApjxPY?= =?us-ascii?Q?BSGVfA4bVWK3lbGunWQNJmYbdJi/j4cRYvjicoHwNqxYMWkWcQCfpT9B50om?= =?us-ascii?Q?e0pRj/tjuXoFr2PFTbEfuzkxfdP8i2amOmuBhtqe7mwk8B5Xru4hK7hqSIX0?= =?us-ascii?Q?T0VpbgHyEPg2z41LEdfpVCjOf7t/C4IpJv8CrVHFT6Nrv/BhEHV5BRzuBCJ9?= =?us-ascii?Q?uFgEaoOsSw=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5158ec5f-6ecf-45c9-0d78-08debdf8efe4 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:00.8675 (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: r0YFBXFuWyWoL1dJWKZrlVKGdfRolIiirIggF5vY4/OWZC+snadcxF4+kDuF6LysAydtdYrfZRlKa6mEr36A4w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB5863 Content-Type: text/plain; charset="utf-8" Hopper and Blackwell need a larger non-WPR heap than the 1 MiB that earlier architectures use. Hopper and Blackwell GB10x need 2 MiB, while Blackwell GB20x needs 2 MiB + 128 KiB. Because GB10x and GB20x diverge here, give each Blackwell family its own framebuffer HAL and select the non-WPR heap size per chipset family. Signed-off-by: John Hubbard Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/fb.rs | 5 ++- drivers/gpu/nova-core/fb/hal.rs | 16 +++++++-- drivers/gpu/nova-core/fb/hal/gb100.rs | 9 +++-- drivers/gpu/nova-core/fb/hal/gb202.rs | 52 +++++++++++++++++++++++++++ drivers/gpu/nova-core/fb/hal/gh100.rs | 10 +++++- 5 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 drivers/gpu/nova-core/fb/hal/gb202.rs diff --git a/drivers/gpu/nova-core/fb.rs b/drivers/gpu/nova-core/fb.rs index d7a4dc944131..0aaee718c2c3 100644 --- a/drivers/gpu/nova-core/fb.rs +++ b/drivers/gpu/nova-core/fb.rs @@ -252,9 +252,8 @@ pub(crate) fn new(chipset: Chipset, bar: &Bar0, gsp_fw:= &GspFirmware) -> Result< }; =20 let heap =3D { - const HEAP_SIZE: u64 =3D u64::SZ_1M; - - FbRange(wpr2.start - HEAP_SIZE..wpr2.start) + let heap_size =3D u64::from(hal.non_wpr_heap_size()); + FbRange(wpr2.start - heap_size..wpr2.start) }; =20 Ok(Self { diff --git a/drivers/gpu/nova-core/fb/hal.rs b/drivers/gpu/nova-core/fb/hal= .rs index e6ac55bba9b9..acb934f9aa9f 100644 --- a/drivers/gpu/nova-core/fb/hal.rs +++ b/drivers/gpu/nova-core/fb/hal.rs @@ -1,7 +1,10 @@ // SPDX-License-Identifier: GPL-2.0 // SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AF= FILIATES. All rights reserved. =20 -use kernel::prelude::*; +use kernel::{ + prelude::*, + sizes::SizeConstants, // +}; =20 use crate::{ driver::Bar0, @@ -14,6 +17,7 @@ mod ga100; mod ga102; mod gb100; +mod gb202; mod gh100; mod tu102; =20 @@ -37,6 +41,13 @@ pub(crate) trait FbHal { =20 /// Returns the FRTS size, in bytes. fn frts_size(&self) -> u64; + + /// Returns the non-WPR heap size for this chipset, in bytes. + /// + /// Older architectures use 1 MiB. Hopper and Blackwell override this. + fn non_wpr_heap_size(&self) -> u32 { + u32::SZ_1M + } } =20 /// Returns the HAL corresponding to `chipset`. @@ -46,6 +57,7 @@ pub(super) fn fb_hal(chipset: Chipset) -> &'static dyn Fb= Hal { Architecture::Ampere if chipset =3D=3D Chipset::GA100 =3D> ga100::= GA100_HAL, Architecture::Ampere | Architecture::Ada =3D> ga102::GA102_HAL, Architecture::Hopper =3D> gh100::GH100_HAL, - Architecture::BlackwellGB10x | Architecture::BlackwellGB20x =3D> g= b100::GB100_HAL, + Architecture::BlackwellGB10x =3D> gb100::GB100_HAL, + Architecture::BlackwellGB20x =3D> gb202::GB202_HAL, } } diff --git a/drivers/gpu/nova-core/fb/hal/gb100.rs b/drivers/gpu/nova-core/= fb/hal/gb100.rs index c78027c26a9e..8d63350abf8a 100644 --- a/drivers/gpu/nova-core/fb/hal/gb100.rs +++ b/drivers/gpu/nova-core/fb/hal/gb100.rs @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. =20 -//! Blackwell framebuffer HAL. +//! Blackwell GB10x framebuffer HAL. =20 use kernel::{ prelude::*, @@ -20,7 +20,7 @@ =20 struct Gb100; =20 -const fn pmu_reserved_size_gb100() -> u32 { +pub(super) const fn pmu_reserved_size_gb100() -> u32 { usize_into_u32::<{ const_align_up(SZ_8M + SZ_16M + SZ_4K, Alignment::n= ew::()).unwrap() }>( ) } @@ -48,6 +48,11 @@ fn pmu_reserved_size(&self) -> u32 { pmu_reserved_size_gb100() } =20 + fn non_wpr_heap_size(&self) -> u32 { + // Non-WPR heap for GB10x (see Open RM: kgspGetNonWprHeapSize, GB1= 00/GB102). + u32::SZ_2M + } + fn frts_size(&self) -> u64 { super::tu102::frts_size_tu102() } diff --git a/drivers/gpu/nova-core/fb/hal/gb202.rs b/drivers/gpu/nova-core/= fb/hal/gb202.rs new file mode 100644 index 000000000000..542c1d7429e9 --- /dev/null +++ b/drivers/gpu/nova-core/fb/hal/gb202.rs @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Blackwell GB20x framebuffer HAL. + +use kernel::{ + prelude::*, + sizes::SizeConstants, // +}; + +use crate::{ + driver::Bar0, + fb::hal::FbHal, // +}; + +struct Gb202; + +impl FbHal for Gb202 { + fn read_sysmem_flush_page(&self, bar: &Bar0) -> u64 { + super::ga100::read_sysmem_flush_page_ga100(bar) + } + + fn write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) -> Result { + super::ga100::write_sysmem_flush_page_ga100(bar, addr); + + Ok(()) + } + + fn supports_display(&self, bar: &Bar0) -> bool { + super::ga100::display_enabled_ga100(bar) + } + + fn vidmem_size(&self, bar: &Bar0) -> u64 { + super::ga102::vidmem_size_ga102(bar) + } + + fn pmu_reserved_size(&self) -> u32 { + super::gb100::pmu_reserved_size_gb100() + } + + fn non_wpr_heap_size(&self) -> u32 { + // Non-WPR heap for GB20x (see Open RM: kgspGetNonWprHeapSize, GB2= 02+). + u32::SZ_2M + u32::SZ_128K + } + + fn frts_size(&self) -> u64 { + super::tu102::frts_size_tu102() + } +} + +const GB202: Gb202 =3D Gb202; +pub(super) const GB202_HAL: &dyn FbHal =3D &GB202; diff --git a/drivers/gpu/nova-core/fb/hal/gh100.rs b/drivers/gpu/nova-core/= fb/hal/gh100.rs index c122ac2091f8..8f79c72b1823 100644 --- a/drivers/gpu/nova-core/fb/hal/gh100.rs +++ b/drivers/gpu/nova-core/fb/hal/gh100.rs @@ -1,7 +1,10 @@ // SPDX-License-Identifier: GPL-2.0 // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. =20 -use kernel::prelude::*; +use kernel::{ + prelude::*, + sizes::SizeConstants, // +}; =20 use crate::{ driver::Bar0, @@ -33,6 +36,11 @@ fn pmu_reserved_size(&self) -> u32 { super::tu102::pmu_reserved_size_tu102() } =20 + fn non_wpr_heap_size(&self) -> u32 { + // Non-WPR heap for Hopper (see Open RM: kgspCalculateFbLayout_GH1= 00). + u32::SZ_2M + } + fn frts_size(&self) -> u64 { super::tu102::frts_size_tu102() } --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010010.outbound.protection.outlook.com [52.101.85.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 7F6BE345751; Sat, 30 May 2026 03:10:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.10 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110631; cv=fail; b=Lp0rEDmWT7v/VUZeHc8UuS64csPxQhUozEgv5X3S/rM1IDPQIl+Emzi5SkINmgTCV6PhtbcrqURh95wSVYcXuuUJ4nhkXmDfCxBtB/FcJD/MAK1bJNU09hD9nDQBnM41Cy/njWqtdpjOLW8IRaqZkfWygmlnu0AzaiLgeuHWZx4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110631; c=relaxed/simple; bh=CdayAdjeOqL6QVaa5LpxPI+GeL7UUW3pU6Zxv1iZYXU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=kTyFoHDDra/cWUSsqwSqdRTjnvU0Qxd6xOxDkNRNNJ23Bt7sxc8iEc9Wy8ydBEULx1b6UpXW746AVfACIMo/pWe5lkTxR/RctEBhY61H1Qck7zz5qqVxcApl9dSA/EaQ08ZtmFn+Vsx6bg1c82T4PWm6CRsqkbbkXBwV2oew9qY= 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=KdR3AUXz; arc=fail smtp.client-ip=52.101.85.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="KdR3AUXz" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=yVDjKlFTgRv+QIzrpVDYBdRjCoC9SdE8h6BK6h9GwXynx733cXWwElvp1VNRwTsjfVlealVoMyJZj0+LwDTGjfIHzzO/VLK/3NTd6AvAumGFlggpZx17IxLWFu4vlJpeaJFEBuZtuH1CHkY833A5TYX1QydD+rHFUfVBbwDCmWjplCky09zJYuPQ3aAxW9LolOEBd3VGYgXk5N/6BqrKCfaCgBLrMYi5O3o85+z/IUqF9mugJv+2eqnlWjHY5A5l3VHInvZoZ180qccpfmyvt51DuH8UzmR5n1AU7ISxDwV1ndgh28FQP3QfoA9iSqY0HWqJsAltTENxIcubM+JhHA== 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=7S6k/noCgrLfF0Cg5++7FtnVPbMFVn9ttcq8d0vhEoc=; b=Pd3hEpOPsUn5EtNfW70uG5S18GY0mlS/mf/dMdhBIIRqbFdgCUY2IoGmnioxjhWt0AGP/p9nU+c3+DZ6LSSrWPS0in1C+Wfx7NqvL/OQAYPydAZSTvtZNwjc/68iqOHFb8ZgewvC0gc8I8RQiLh19zHcG+vXD1RBcvcjC3MrwoUZXNzyTCwcPEyNEB68FwMM2NNeldmU35SNHj3LEsPZPJU76dVtBI8YIJgA4K+3Q07uWs3MXssbFA0F90P+kjO6fIeo220iWFmlmzaSRQ+vMXG8356POhWfVoiR+o2woKTcATgL3CDv02YjsNYVlpXB/KGLao7VLn0IvE7Lzwn0rg== 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=7S6k/noCgrLfF0Cg5++7FtnVPbMFVn9ttcq8d0vhEoc=; b=KdR3AUXzgKcDKZ20o5+lin2Jus/O8pkuLv2G0yFJh0DriR696uCcWX71jyPHez9vJQEOqPP79dMyXL6g1lPzNcQRR3sLmv0LkgpRKT2/+4O3WAIgF97TrxVoMqLhcd6ms2M5fKQYtvv6YWdR3PDN9ByShNFDteY1Ixr9wkQrWniCV07RcWYuupV/+bAgdhSqcUj4TADJJCcXcyZguDtfqayy50M+wud1EsiCllokTVIfsAJ5dM7JBLkNrOZkBJPpvY9cbEv/VQnDYwZ0XN4ImZ1Sfs3tSbvyR62UEiWSKVPe6vHf0eLXL726nYO+1aZ6y7FCX9Wv6D+/dXXJddsu+Q== 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 DS7PR12MB5863.namprd12.prod.outlook.com (2603:10b6:8:7a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:02 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:02 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 05/22] gpu: nova-core: Hopper/Blackwell: larger WPR2 (GSP) heap Date: Fri, 29 May 2026 20:09:36 -0700 Message-ID: <20260530030953.740561-6-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0126.namprd03.prod.outlook.com (2603:10b6:a03:33c::11) 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_|DS7PR12MB5863:EE_ X-MS-Office365-Filtering-Correlation-Id: 57296e18-fbef-4ce6-9044-08debdf8f0a5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|7416014|376014|56012099006|6133799003|11063799006|3023799007|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: GQYdWSdw+lAyLzqSXZNxXZwXJWnYk4pnhDSjOxwgNOhNeoHJEg9s1QQt+G6YjFZ2uzWZJGWMgNNd4KCHf78dfCdcjtlopyMrZasp323y1QQ2bj7xficlXSA1OyQEZBy/wN9X/Bs9aCg90G4BaCOCen+m9uNHhXFsaN/NiDRW8zK1iPH1u3V+0CXbtIVBUyfUIyDOUVcgMzJKM1bcC4+ee5LD/B0tyXI9pD0ncXU/dyvF6H0E8paER9y0t034mshoTW8rsP6k9/xHp9x1wzk34nwkDCiqXfZhP4vfrYJeGJ8eZL/3D6fvcItdmBbspU/hI1SWZ13FFnw03PNJId/MQKZSd1E8x8TYrgsi8Up2Ueyt31bnR2LHnF7f9hCieMMx5dfqAlEueqJrO4SqTIaiue9NgJtEm9gD0ogq78D/lL6akC31B1RnKw8s47OPXsASQDje6Xq0/LFvMKT/qoPfFXzkJ8Izd/bkfaozf0arz8ANPtnjgs+Qxa2ZV+gc8YgVDb8GoahUPl9Yir6T7+hf6Nd/7sYU+9SnyPhxg02UxozSZjlzXZmWIFmmgkEyZmkYlYrDW8UMCzaSv0j3OH2ZS1p0MnZ+F1EJOFGLZtmZNMBMCwI139VGn0BIf2Z2OFhVDq2doCuUGI7+p6ka7sGPL3FbGNwqwB+flM5f7tsdwcSZMzQNb+3rPnl+TsylLEg4 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)(1800799024)(366016)(7416014)(376014)(56012099006)(6133799003)(11063799006)(3023799007)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?NbESc7Qbta1f5F2oNB2yD1f7XpH+FjYNdD7lVD/6ZDlsET2M3Llf5DzRxjor?= =?us-ascii?Q?5Eywr6j+5mwxP4cZNBmpLr5IywX8sjqSl66slEKfEfvZ+2LGSV0ozcTuADh3?= =?us-ascii?Q?eourOfnu4Tp7Ky0U46+M0Y5vQbOvv06StKwlEO8jLaCTT3HtXIOXIKvarPn/?= =?us-ascii?Q?1caOWqdIY+msMzxJmg80Ki40rZ5vS5mebqR8o1YIzBCYUwqhNFQesU9RBVok?= =?us-ascii?Q?cZy43uwWpnk7qmqPGFAryEtpaSCQ8aDCTD28tsvfo7VtAQgloecKdjLVG6ZH?= =?us-ascii?Q?DakNbk2Mc8m/QprhLEeqfuQ+ISW1o/VOrs33tAw0t4yl/yVaIC50sYAAI6eU?= =?us-ascii?Q?Ols+SGXzPpRjuXsEInpWPFvuxAPrI8keS7v/2trP24WE3uVYIb9z4xwL7Ytm?= =?us-ascii?Q?hWdLa8O5EfwM0YlwFrvXuVpb+c03XcQmhlX2Xugy/8CH9PqxgjKTUItj32R4?= =?us-ascii?Q?EMmMBNQepWTiWNMs4Cnl/ChJ2perCY6Ios/5JkHUGq5Hk8Og+k8cOTzC4uLM?= =?us-ascii?Q?DKL092F31F1cf959Agzmq0K8bRVGnL+T6GJoOTU9nlyI7moOR0CqyFcOruji?= =?us-ascii?Q?OzbfWxs6lU0w0X6YpFS8XGTBPQTCbeFndkAwrZBB8rf3geuWIY86dIyTxRL2?= =?us-ascii?Q?5gK9vWhEQHqsYcGZsgesQ7XZm6K21f/MisQ2BaH5Pi2MbRMggh1WG6eqc2w4?= =?us-ascii?Q?koO+P+rQotrXLd72j8XzC1EzPpDRFBB/MkXRY+T3DfELUdw1l4GrwEE6Q3rF?= =?us-ascii?Q?/ac9WRQ+dUKknqQ7hYOQr//opVaHniwKJsDUQqSb5OiFxgDffK05hk/SPWfC?= =?us-ascii?Q?XjCPlj/FLbkAmMDQeM7scvgnTIp/DpYKb6BDAyvQNoaUoOmKtF6fcNGd8/rz?= =?us-ascii?Q?zS7xjJ5eeYTYtLseJk7KXHwrpNqc3bZk6WnikYr26I+53WXdwy+gUV7PFy07?= =?us-ascii?Q?S8yO+q4H8UFfYeuhJVdr4hA5iYcI7APxXbi8UprRjEftE6hxeG8ASIh+L0sT?= =?us-ascii?Q?eV34lUx9eT6cSgjal0jxZ0JTkUPhWwmF0qopsOTBKqIPAAXt0ThyQIYrHy2l?= =?us-ascii?Q?1YzcEeKaCxjkk2BS2bU3y11qFhaT7Mc0gnSJaS6okKL3coCP3JQD9Ha+jLk8?= =?us-ascii?Q?fL8s1L2AbvQhbF8mEw3Nz7n1q6MhYt3ORyLsF0O69iSoNH1G/7fwB07x0o2f?= =?us-ascii?Q?dcjmgv+EGXNSAQAHgCpkj0N6p9wA1FYWGlA+Mg82JwrgNX/lgUGItfQSjVvH?= =?us-ascii?Q?PBbHdNiQaK37ownIV7IiVJO/3EcZivrnK0OigM7axpUrW4n9tPWl7BoW/Asd?= =?us-ascii?Q?VXBBiIxlipcOz9pJVkt3W3T5pVKZntIexM3W+iLbrOFdPG9mqVXIsxQC1r1W?= =?us-ascii?Q?nw7Pw5gHcQU9axMjy46UbomEu/dlMyXnBNa+ONLBJNhCE0C6uOl48nd5Tgke?= =?us-ascii?Q?rxZ6gzYsDQMldk/LecPfVOkeJnxySe7qsH3r230L5OwgDJYXzTQ73rfV88md?= =?us-ascii?Q?qcGI8dRAny5aSACg1w1SwGdWcXGrVsVrFfx3MggyxLgonU0815oX+ypHG6sV?= =?us-ascii?Q?GYz0QIcwWGvHCujoDU9mZ/US42ecNNwpKUd9EUtiDz4YdpJNFzunw0q7OafJ?= =?us-ascii?Q?z5h8UGnuHfzkoYWeQnntspYQUDcfRPimJEREGwEJbEh4SWZD/gMXCVE+ch2y?= =?us-ascii?Q?+CwNSwd8bg7s2wnRHmcFKjATuF9g/HkDmgRs8WaL3nSPiViS+7BskhdjAkJE?= =?us-ascii?Q?cHgHTLME3A=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 57296e18-fbef-4ce6-9044-08debdf8f0a5 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:02.1521 (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: xPEiWNUF0qnHyYE8djYPqasGPHo67tVFpXlPB+XNLh2/jY1cu8cALEGWzmSa85CGcEfG/JhfRv8Poq6MYv45XA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB5863 Content-Type: text/plain; charset="utf-8" The GSP-RM boot working memory portion of the WPR2 heap must be larger on Hopper and later GPUs than on Turing, Ampere, and Ada. Select the larger value for those generations. Signed-off-by: John Hubbard Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/gsp/fw.rs | 20 +++++++++++++------ .../gpu/nova-core/gsp/fw/r570_144/bindings.rs | 1 + 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index 919d3ab00075..0c54e8bf4bb3 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AF= FILIATES. All rights reserved. =20 pub(crate) mod commands; mod r570_144; @@ -29,7 +30,10 @@ use crate::{ fb::FbLayout, firmware::gsp::GspFirmware, - gpu::Chipset, + gpu::{ + Architecture, + Chipset, // + }, gsp::{ cmdq::Cmdq, // GSP_PAGE_SIZE, @@ -106,11 +110,15 @@ enum GspFwHeapParams {} impl GspFwHeapParams { /// Returns the amount of GSP-RM heap memory used during GSP-RM boot a= nd initialization (up to /// and including the first client subdevice allocation). - fn base_rm_size(_chipset: Chipset) -> u64 { - // TODO: this needs to be updated to return the correct value for = Hopper+ once support for - // them is added: - // u64::from(bindings::GSP_FW_HEAP_PARAM_BASE_RM_SIZE_GH100) - u64::from(bindings::GSP_FW_HEAP_PARAM_BASE_RM_SIZE_TU10X) + fn base_rm_size(chipset: Chipset) -> u64 { + match chipset.arch() { + Architecture::Turing | Architecture::Ampere | Architecture::Ad= a =3D> { + u64::from(bindings::GSP_FW_HEAP_PARAM_BASE_RM_SIZE_TU10X) + } + Architecture::Hopper | Architecture::BlackwellGB10x | Architec= ture::BlackwellGB20x =3D> { + u64::from(bindings::GSP_FW_HEAP_PARAM_BASE_RM_SIZE_GH100) + } + } } =20 /// Returns the amount of heap memory required to support a single cha= nnel allocation. diff --git a/drivers/gpu/nova-core/gsp/fw/r570_144/bindings.rs b/drivers/gp= u/nova-core/gsp/fw/r570_144/bindings.rs index f82ed097b283..1d592bd3f9ed 100644 --- a/drivers/gpu/nova-core/gsp/fw/r570_144/bindings.rs +++ b/drivers/gpu/nova-core/gsp/fw/r570_144/bindings.rs @@ -37,6 +37,7 @@ fn fmt(&self, fmt: &mut ::core::fmt::Formatter<'_>) -> ::= core::fmt::Result { pub const GSP_FW_HEAP_PARAM_OS_SIZE_LIBOS2: u32 =3D 0; pub const GSP_FW_HEAP_PARAM_OS_SIZE_LIBOS3_BAREMETAL: u32 =3D 23068672; pub const GSP_FW_HEAP_PARAM_BASE_RM_SIZE_TU10X: u32 =3D 8388608; +pub const GSP_FW_HEAP_PARAM_BASE_RM_SIZE_GH100: u32 =3D 14680064; pub const GSP_FW_HEAP_PARAM_SIZE_PER_GB_FB: u32 =3D 98304; pub const GSP_FW_HEAP_PARAM_CLIENT_ALLOC_SIZE: u32 =3D 100663296; pub const GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS2_MIN_MB: u32 =3D 64; --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from PH7PR06CU001.outbound.protection.outlook.com (mail-westus3azon11010063.outbound.protection.outlook.com [52.101.201.63]) (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 B37A734572B; Sat, 30 May 2026 03:10:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.201.63 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110633; cv=fail; b=a3n8Ur9m9b0/7b4OJProoQqC7Zt9qea3r1BWHn/KPje0Q8/oBleTgLay0IcoNCf4XdN9ok8vH6OvyU+YMX+uZ7MiXjgLrmtutJXq6SLxMIy4nP6gbu3N7bHsSe1UAl+CR3osBucDZDupL28DR1Sg1Pe9QK6XyKVGz05WtrJNu6g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110633; c=relaxed/simple; bh=rmzgI7jZlvi4pOldwYGtTWjKxTFDkiIxQL5Mu21k6v8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=rhT7IyyqQvvYyITacDYdXfMWNCwDQYvVJvF/e9wHqqneKPt1TtJTiMiKqaDOzDaDyvj3x7J5auttwrbZljCDUZhOqy7RvyXuenfIUr1bEH5GP2ZNCE24zXQ/aaWa7veo5sGqQmQrK2rq/hfdU+LOTIYL8oF1G1JTUi4gWrFBtg8= 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=dpKVgGPW; arc=fail smtp.client-ip=52.101.201.63 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="dpKVgGPW" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=TuvbgYGKc1wOTRvP17sWd4MJzPC7DBuyLVmX7DsswLIxHiBrnJuFA1TDvr2dd5LTw/k84OMx2mt6u6M/VkJk8vpfEDHtLyhrIsOwzaepcTDPFJwBxlV0HWNaB001jaDZPIsFlgKaOWs11FI1HWaLOJUd+58ltpePz9Z5FJOZ/n4Jo6OAAkA8JhA8D7xq1babIG/+7zsEveACkPR+36PeVB4iYZ4klkVhX0Bw1KnZyLONYY92jQ3oz0l/rvlYbRK8DSAnWqmb6ujtC2ujx+3VBVUXVHgbfDVt9chVfu+pcvU94Nu0JMWqURLyZ2J3j4iZWDl2U6UPsaq3s1HXCMa/Ow== 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=OkTIBuFw3vSn4XXKAj2xYt8lJTJ1y0nOkJ7MNbT5Jx0=; b=FjA5zj68qO9yMCWRNlcwBQkWzxaPZkbx2YMsRn0j6+WpHNuqRmDIreGBDWWYnkK0pTRjQMNcfCa7CSJPU4ZzJu6R3wGu8U5Y/r+BfSh1WO+c+cDZ21SMrC99gKmYsMVJHGOhT7MatteLIG9qxZRubulJVZ6rFBS3ROdjLMZ+verKrLLpcYPiGhEH/K5EyqlRF4kZ68C0zvisYDQUD/AUs0b/96qWeAE4aeDyB58btHYg/mlPdzk0KwFtNY/toljPdYB8Nap8nFK/o74pfikro6G63BMyOC6KtQ63I4HBCrqi38Z/Qq0dhqJFiVxiB93fCIForSNdtcsUULcO0U/ahQ== 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=OkTIBuFw3vSn4XXKAj2xYt8lJTJ1y0nOkJ7MNbT5Jx0=; b=dpKVgGPW4xScDsVNcZbL2vA9Ywf6zoR0wK7yJK4VZl508BQMf/pyGUpPJd8EE+ssrJotkfJlCvhw0LzqLmPIWnnSqyjGbsaU08xd4HedV4bFSNR40f35oJITgbsmowALfLDH5w+1t/KSW9RH7vr8Z+ymb+pBr5D23W/GLcgviNt1AX4Vfj9WqdAj4GqJ36Zmy7tzdXPI/kV3+pCghKHFHDCGvmUbzOIY/UcorWf8HKTINAmTOrUOAY8J6/2jja6FuK55v4UJkQoyVS+dzFJqkDiz3xaZsGE29gZHSHvLahr/cJlGY0SwqPoyQAM3YVdcFgn8W1tNBvc2mkhZnFzKJw== 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 DS7PR12MB5863.namprd12.prod.outlook.com (2603:10b6:8:7a::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:03 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:03 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 06/22] gpu: nova-core: Blackwell: use correct sysmem flush registers Date: Fri, 29 May 2026 20:09:37 -0700 Message-ID: <20260530030953.740561-7-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR05CA0108.namprd05.prod.outlook.com (2603:10b6:a03:334::23) 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_|DS7PR12MB5863:EE_ X-MS-Office365-Filtering-Correlation-Id: b849fc3c-831e-490d-ff4e-08debdf8f169 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|7416014|376014|56012099006|6133799003|11063799006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: iCrLLPaAjSjNXNedwwz6yDU4UbqZ41Si5eYMFH0tDCSHBE8mOCzU1q5ZXxDSfbr+6+AOdJaMRAPWSbU+gwllkB91ViM70F7R9jXO2VXTV5GSDM4t8Q8IV6W485E586Mr1LsQhSHRp89J5xfuMWUU59e+AzOUV1ZcH33odfh9YKK7Eg2DeCA2ssf5nPPy4EdZOdkhUhrE2aMq1jx3x9lMf6I5bNdXI3HEoTb1zirkoyzvd2m+3J1/QqFAFoLs8acxqIhT6QyBnNdh/1WqSEQR1lffkSpe+e1VOvmgfgWj54Mv+R5y8w1klEplwzRSWpGhacanj3v2fdM9ifKKL8Y4MkcZJU0BfeN4Yj+xhSGAJXrdA9JBiUG4q+1qIL/msP12pycOhC9WGf5/G6MjrINbRl0YoB5jSpFzfCTeDjMjOcA2ewp3Iy3OKyA4NCCcLuKqmbRcxI9sBVRQ2dFIl6CzkbZuYT0owM/t9QXe9pMmscaLY/kHE6QY+pn9xK6kS96kJrW21Y2/nljCkAaSWIOskN60fBEg7HNcX/wJplE2TS8GOwWBpAdGsP1/L/LQqk5n51kZp9f3zZQE2/dy0hItGKnYEbA1Cc25meH2Vr/3IydNjvdFkGSMidvQtNI1d6z1tDShxGiXaMHwNCK/yz1pmbZfmf43W8R1thXOqH/6nIr/AdWJIPt2Nt6Xy3sPhEeN 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)(1800799024)(366016)(7416014)(376014)(56012099006)(6133799003)(11063799006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?K5N8vx9Tt8wUlfRszKk0yrhRDdoLNkMDv6XllRJhFw2D/9XHfv9YB2Ipzv2q?= =?us-ascii?Q?UpLOLo2FsfmV2AulNg1EJ9Z2pLCZYMxP5h8gej0Wly/gGQUMtlaKHIAQ2YqP?= =?us-ascii?Q?JE+loeRTqDjhGdW8YmK6OZeL5EPTXh4uYmptWdrHIrMUOG65/D4RLB4ARxpq?= =?us-ascii?Q?75l2QCYlvm+c1t02bfoR4MkRFmPEXE54NmWI+QFkLQEW43faFq2TadMvtxmR?= =?us-ascii?Q?QfLBoXIMy3/syWNqzTICvFG4fiUK+Fw5fkzWpI0r81mdB5uBc76p5TBZ6Bqm?= =?us-ascii?Q?00SQ6sBYu+lYgA2cnrC8yCPhd91PKkEwfhr+GIbYWNxfpZqYHbrF7uMItbxx?= =?us-ascii?Q?9mKlECbKHd+jJ67+deSnf3dylfJk6Pxvu6M3Dxu/DW4rqBramxdpmzY6F/4K?= =?us-ascii?Q?5aHM9nw34r94WYHhSVv+cUAon1B9VTgyFAtNcqIQ9Pcp+zXksQtAp/DvqafT?= =?us-ascii?Q?jx8w9MfvONTtxO/rLJmPPcjtT69lFgmvxT7/YBLXgg2QxX1oiCgb7oH/Lk2i?= =?us-ascii?Q?X/TmEeM+hstyKAd0kwcsWjm0mtp06kA5B50w0qyxqXmc59b6iRbqwgZa8sAf?= =?us-ascii?Q?L39MwYH/lEaqhMdjDvYi9g5/ZlAsiwxMKkm/h/ySknBCFOIjbmzJbPZugtsq?= =?us-ascii?Q?WsVzJicfLzSXNZTc/krlJrAH7Ij8bGWHjBKP4hf/YTWQjT2GGtJ7kx+dCqmF?= =?us-ascii?Q?8NOf3DxxSWCq39gAd6ka8CbjqeHj+277cnSOPzo10qRvrTo5ktuYZ6trdXZR?= =?us-ascii?Q?hLbbHY0sEF7vItV73l+OOQD+OLWOS2E0VNsnAekr5XOGf9gMc37qjVUAussG?= =?us-ascii?Q?Eq8cfzwxS5ltpwEMjTYkBhcgQQd0/GxCXKuSJE/kumE9UyoaiOcDxxXk02Ul?= =?us-ascii?Q?6+lNMbJD0mOaIf9mg1lb000sC7+nO8LOqeTbhKPfTLAWy1/nRUfIXbInL5w9?= =?us-ascii?Q?Wx3k2PftRnpKMBDKI5TpcgP5Sm0EQZj9C4qA6HKWZ9BZtNc4w3rmESOKmDoy?= =?us-ascii?Q?pH1zCMTzSdI4KcpaSRjYRI/hx/aWK0hkvE9o9PkLFvPocxzW8SEAWj9K02PO?= =?us-ascii?Q?J0rJL+uJUZCVq8jRWMN/LhGiXMwfVkNGcHxuj9gNvZzTbcIxopageejcCg4M?= =?us-ascii?Q?7d0bjNXpo7R3OEyM2QtH/h1x7FpD51OM3IsMw3/w+Y2YhsfpxXiUT4JTrd2W?= =?us-ascii?Q?nJZoU2Yoe8xp2U90t1Nb9mjK/yBZUeHIq7RzMyd31/ftxOuK58/YWxa6/KSc?= =?us-ascii?Q?QkbeKJXcxEzMIJdUMAszE4relyrjDesAlVxIyVxDkL7Nkz5XoeIVejQTqEkY?= =?us-ascii?Q?39W01qN3sw7MxWE49LtHm3ahQJcx2zIwV7YoeFvSjdoWBafv718KjmQ84I7H?= =?us-ascii?Q?XRHIHSaAmBZXPByc+8KzdaahznSdbplOJGrKXuAdu+8jVQWqjwvECWaA54uP?= =?us-ascii?Q?glyqpQU8b2at2ivk5eIGV0Mpa/PueThtIT63LdPYoxnQL1ST9LFYbYaTCgwN?= =?us-ascii?Q?24lW9tCVS6m9JNJnaj2slDLTuad1VvdJCS9xPeL+JMRFfvIVNRZkRSEoGcjf?= =?us-ascii?Q?MoMYv1rNPMcEELSBhOuBVgXspQrKT0oFtJDheQFskPogYZYPjnflV9l07GDa?= =?us-ascii?Q?oiWpn03hlNyWk2jS+4lS+GDqmc9skRbaflokZaUjur8rSwre5ptsT683afEf?= =?us-ascii?Q?J/lFXmU8QPQQJrLCmOiVcBWoTLEcaptpaAiTdDNC5r0o8TMmlE9XpkAG0ENn?= =?us-ascii?Q?iVcjiqaqxg=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: b849fc3c-831e-490d-ff4e-08debdf8f169 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:03.4332 (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: lfTZqqHx8mupFefSyBEY7bFnGUQsquvXFzjlJQ13JnlAuu4eci4CenN/YPFK/lQY2BFeqS6SJU1JmV2jLn1Jrw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB5863 Content-Type: text/plain; charset="utf-8" Blackwell GPUs moved the sysmem flush page registers away from the Ampere/Ada location. GB10x routes the flush through a pair of HSHUB0 register sets (primary and egress) that must both be programmed to the same address. GB20x routes it through FBHUB0. Implement these paths in the GB10x and GB20x framebuffer HALs. Signed-off-by: John Hubbard --- drivers/gpu/nova-core/fb/hal/gb100.rs | 46 +++++++++++++++++++++++++-- drivers/gpu/nova-core/fb/hal/gb202.rs | 40 +++++++++++++++++++++-- drivers/gpu/nova-core/regs.rs | 37 +++++++++++++++++++++ 3 files changed, 117 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/nova-core/fb/hal/gb100.rs b/drivers/gpu/nova-core/= fb/hal/gb100.rs index 8d63350abf8a..70f4c11b1e77 100644 --- a/drivers/gpu/nova-core/fb/hal/gb100.rs +++ b/drivers/gpu/nova-core/fb/hal/gb100.rs @@ -4,6 +4,8 @@ //! Blackwell GB10x framebuffer HAL. =20 use kernel::{ + io::Io, + num::Bounded, prelude::*, ptr::{ const_align_up, @@ -15,11 +17,45 @@ use crate::{ driver::Bar0, fb::hal::FbHal, - num::usize_into_u32, // + num::usize_into_u32, + regs, // }; =20 struct Gb100; =20 +fn read_sysmem_flush_page_gb100(bar: &Bar0) -> u64 { + let lo =3D u64::from( + bar.read(regs::NV_PFB_HSHUB0_PCIE_FLUSH_SYSMEM_ADDR_LO) + .adr(), + ); + let hi =3D u64::from( + bar.read(regs::NV_PFB_HSHUB0_PCIE_FLUSH_SYSMEM_ADDR_HI) + .adr(), + ); + + lo | (hi << 32) +} + +/// Write the sysmem flush page address through the GB10x HSHUB0 registers. +/// +/// Both the primary and EG (egress) register pairs must be programmed to = the same address, +/// as required by hardware. +fn write_sysmem_flush_page_gb100(bar: &Bar0, addr: Bounded) { + // CAST: lower 32 bits. Hardware ignores bits 7:0. + let addr_lo =3D *addr as u32; + let addr_hi =3D addr.shr::<32, 20>().cast::(); + + // Write HI first. The hardware will trigger the flush on the LO write. + + // Primary HSHUB pair. + bar.write_reg(regs::NV_PFB_HSHUB0_PCIE_FLUSH_SYSMEM_ADDR_HI::zeroed().= with_adr(addr_hi)); + bar.write_reg(regs::NV_PFB_HSHUB0_PCIE_FLUSH_SYSMEM_ADDR_LO::zeroed().= with_adr(addr_lo)); + + // EG (egress) pair -- must match the primary pair. + bar.write_reg(regs::NV_PFB_HSHUB0_EG_PCIE_FLUSH_SYSMEM_ADDR_HI::zeroed= ().with_adr(addr_hi)); + bar.write_reg(regs::NV_PFB_HSHUB0_EG_PCIE_FLUSH_SYSMEM_ADDR_LO::zeroed= ().with_adr(addr_lo)); +} + pub(super) const fn pmu_reserved_size_gb100() -> u32 { usize_into_u32::<{ const_align_up(SZ_8M + SZ_16M + SZ_4K, Alignment::n= ew::()).unwrap() }>( ) @@ -27,11 +63,15 @@ pub(super) const fn pmu_reserved_size_gb100() -> u32 { =20 impl FbHal for Gb100 { fn read_sysmem_flush_page(&self, bar: &Bar0) -> u64 { - super::ga100::read_sysmem_flush_page_ga100(bar) + read_sysmem_flush_page_gb100(bar) } =20 fn write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) -> Result { - super::ga100::write_sysmem_flush_page_ga100(bar, addr); + let addr: Bounded =3D Bounded::::from(addr) + .try_shrink::<52>() + .ok_or(EINVAL)?; + + write_sysmem_flush_page_gb100(bar, addr); =20 Ok(()) } diff --git a/drivers/gpu/nova-core/fb/hal/gb202.rs b/drivers/gpu/nova-core/= fb/hal/gb202.rs index 542c1d7429e9..5a6b815eec3d 100644 --- a/drivers/gpu/nova-core/fb/hal/gb202.rs +++ b/drivers/gpu/nova-core/fb/hal/gb202.rs @@ -4,24 +4,58 @@ //! Blackwell GB20x framebuffer HAL. =20 use kernel::{ + io::Io, + num::Bounded, prelude::*, sizes::SizeConstants, // }; =20 use crate::{ driver::Bar0, - fb::hal::FbHal, // + fb::hal::FbHal, + regs, // }; =20 struct Gb202; =20 +fn read_sysmem_flush_page_gb202(bar: &Bar0) -> u64 { + let lo =3D u64::from( + bar.read(regs::NV_PFB_FBHUB0_PCIE_FLUSH_SYSMEM_ADDR_LO) + .adr(), + ); + let hi =3D u64::from( + bar.read(regs::NV_PFB_FBHUB0_PCIE_FLUSH_SYSMEM_ADDR_HI) + .adr(), + ); + + lo | (hi << 32) +} + +/// Write the sysmem flush page address through the GB20x FBHUB0 registers. +fn write_sysmem_flush_page_gb202(bar: &Bar0, addr: Bounded) { + // Write HI first. The hardware will trigger the flush on the LO write. + bar.write_reg( + regs::NV_PFB_FBHUB0_PCIE_FLUSH_SYSMEM_ADDR_HI::zeroed() + .with_adr(addr.shr::<32, 20>().cast::()), + ); + bar.write_reg( + regs::NV_PFB_FBHUB0_PCIE_FLUSH_SYSMEM_ADDR_LO::zeroed() + // CAST: lower 32 bits. Hardware ignores bits 7:0. + .with_adr(*addr as u32), + ); +} + impl FbHal for Gb202 { fn read_sysmem_flush_page(&self, bar: &Bar0) -> u64 { - super::ga100::read_sysmem_flush_page_ga100(bar) + read_sysmem_flush_page_gb202(bar) } =20 fn write_sysmem_flush_page(&self, bar: &Bar0, addr: u64) -> Result { - super::ga100::write_sysmem_flush_page_ga100(bar, addr); + let addr: Bounded =3D Bounded::::from(addr) + .try_shrink::<52>() + .ok_or(EINVAL)?; + + write_sysmem_flush_page_gb202(bar, addr); =20 Ok(()) } diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 356fbf364ea5..65be6ec71ed4 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AF= FILIATES. All rights reserved. =20 use kernel::{ io::{ @@ -145,6 +146,42 @@ fn fmt(&self, f: &mut kernel::fmt::Formatter<'_>) -> k= ernel::fmt::Result { /// Bits 12..40 of the higher (exclusive) bound of the WPR2 region. 31:4 hi_val; } + + // Blackwell GB10x sysmem flush registers (HSHUB0). + // + // GB10x GPUs use two pairs of HSHUB registers for sysmembar: a primar= y pair and an EG + // (egress) pair. Both must be programmed to the same address. Hardwar= e ignores bits 7:0 + // of each LO register. HSHUB0 base is 0x00891000. + + pub(crate) NV_PFB_HSHUB0_PCIE_FLUSH_SYSMEM_ADDR_LO(u32) @ 0x00891e50 { + 31:0 adr =3D> u32; + } + + pub(crate) NV_PFB_HSHUB0_PCIE_FLUSH_SYSMEM_ADDR_HI(u32) @ 0x00891e54 { + 19:0 adr; + } + + pub(crate) NV_PFB_HSHUB0_EG_PCIE_FLUSH_SYSMEM_ADDR_LO(u32) @ 0x008916c= 0 { + 31:0 adr =3D> u32; + } + + pub(crate) NV_PFB_HSHUB0_EG_PCIE_FLUSH_SYSMEM_ADDR_HI(u32) @ 0x008916c= 4 { + 19:0 adr; + } + + // Blackwell GB20x sysmem flush registers (FBHUB0). + // + // Unlike the older NV_PFB_NISO_FLUSH_SYSMEM_ADDR registers which enco= de the address with an + // 8-bit right-shift, these registers take the raw address split into = lower/upper 32-bit halves. + // The hardware ignores bits 7:0 of the LO register. + + pub(crate) NV_PFB_FBHUB0_PCIE_FLUSH_SYSMEM_ADDR_LO(u32) @ 0x008a1d58 { + 31:0 adr =3D> u32; + } + + pub(crate) NV_PFB_FBHUB0_PCIE_FLUSH_SYSMEM_ADDR_HI(u32) @ 0x008a1d5c { + 19:0 adr; + } } =20 impl NV_PFB_PRI_MMU_LOCAL_MEMORY_RANGE { --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 C67A1288D0; Sat, 30 May 2026 03:10:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110612; cv=fail; b=SIKQkRcwa3ngZcLPJRMDr1/jX2JOd4lGJP4KEjOmIi3MPaw5bShb8dei+XnhFyZRJS+ekHBQyO8UbTLR+Vk2Dn+yDTTVThSvOzAD51R3WsBe9AmrQ/GZWqjB8RrP/sqqZIr+cq0s/xIC94voIpnOHPEeiXaHvZK3QrV0kOpByoo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110612; c=relaxed/simple; bh=PUQiVeIgrTYuKlTweUFHfJCT3o7q222O3fQ+Irc7w6s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=NHHLgrsxz34yImdlTGLIW9yMBAnlcpe3APVjymz749Vms4X2E5ORQpUDyDYVxSqG/b2ow9p+xRfgZWAH4SBupfW22EYMNSzce455c/abRCgbrd42An+ZJ+mmwK6/furEh6DMlwtQaSwK7cP1c6kQnDdHn4GIvse9Mt67WZKHPbk= 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=dX20oSLG; arc=fail smtp.client-ip=40.93.201.22 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="dX20oSLG" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SBb4+TfcH3bKM/lViQ1xFHxkckgIQJEYLlgSM7/cGKEZFdlQ3pHBw5sAOy7JYF1j1Libj4oG76quwIZfoacYJtIv12zQeenKnLd8JC3+b+u6FUKPdpplkFZvxV6m4Ekdnb0B1tG84TZsreyDnsLwecP9772B6lulBUmqnScBhBb+48Kp6PgTFXek6WcT2y/ygl6u31rgNxFxyRlvRtcDe4jngTDWh7mF4DqsyKLobfbS+SeWbXjZhV8uWP+lxNbC8Q9Se9ahEk14aLStZWEPCNHIwrFJRsXYzMAi18EK802A0gQR7SP40T9numvJEh/4KE9JoF5LFWHCZprmfb00KA== 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=qqMBahsTE9NcJY+Gp+UL+ayIQg7zwoR4+i/Kae7SkVk=; b=GYsxP2ev1FIeKmlz8HbaprYwcAAFNxo3bQg35SZXusl+2jWbTqK4bZw7ISLo9Nzdy+w7T9p2CFv1bTVl5dNrmm0JQibONHFtoGTNS+bYixDP1frslxp9k4tyfqmV3bkzJ/Sp3KpNZcrfiNaXOw7tJJ+ywfZq+cDSdhV0BaFGQWwDs5C2DPWbOVZjtW19RjAleP5lSWnF+MEvAaOGcK6LwGD5CU2uIuuw6+VuhnGR/dKr5l/ZFzTeGSqI6claq7qMrvNXH0JCEb09yJCsFvZQKNlkmk/eTvZ4GBop+oe9SBrXVjhrVr/CiumhnmU/hzmLLEZqvBXcgm1A8E1g/w0WpA== 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=qqMBahsTE9NcJY+Gp+UL+ayIQg7zwoR4+i/Kae7SkVk=; b=dX20oSLGAOMYmJIeAMr/0X4zbDNAztv5677HcQ1SYyFibWeLYPz9iKLKRbdOfAuSM2tN0PmHfzvXJHh5U406sqA8UkblULIaz/uype2FEg1nFVkhAjqU+rDMTeh15WClludowkf7byQ+OExnH+Br2I63QHCztNzfkByMzddWjNvdvUqe4kAXYRe7ONLeD5RZSzjXNnVw070UJAq8fsXggPOzDgJUCDtXC4V+iUWjI3zVT0o//m2/vpARMWh3JIlklUWjOrTRRyF9yaT9EtwSpO+w50KLyuwpvqCtKAaZo5y0orn8ajFs2EtgDh1DFWWg7CvlksLir3RKYulGEtVGyg== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10: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%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:04 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 07/22] gpu: nova-core: don't assume 64-bit firmware images Date: Fri, 29 May 2026 20:09:38 -0700 Message-ID: <20260530030953.740561-8-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY3PR04CA0009.namprd04.prod.outlook.com (2603:10b6:a03:217::14) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: fc4b73b9-af97-4b3a-fe51-08debdf8f23d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|6133799003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: KR0Q+JzRYEQ3976Sx5i4Up8lkW8WoRXRD500G0JzRokH5RWmMNZ3n7iidwLwg+sw+DD59s50a1w0Lgz6oAHWuHOR5BlvtIfsMr/h3ZJtnWxFaVJ0AUbS1YapkjPWXmp3TowWS8x/4Uafhh/9E5EjmwsfHsV+rHDbzOZNFfeVv1i5IW2DJF6ju3c8drkM/0FNFFdZvrJEJ1pUr+9oOoO2SP6hacOX2t49mNm+p6LFKCsqJ8ZuOY17YDdqCg5P8T396LnZY6CKMDc6vEEHhTRASVp9HxX9ozezRWSIHUWW+5ENuc4vGr1BeNf8AtSlNSfzy1lWNazfoPwAWJzbx9a5Fu/CWgVd/ZQVrGR+YzAqyBfEvD1WQ99TvtUr1z5hTIRnwPTFMx/iTJL+1mByscafQvQI7bX7/xCCvOb3hFdmXa22OaJ3yZaeCELLXCPQDkRKYXzzVxj7EeqHy55CMjwP5RutE6i8sJvK4L6gIdYfFvywv/yEApuaqPOEEEvIIVlEIkzZi2AIow3oPSSVpzpEwOdMuvEuuwkZnhJEpKLLVXT8oBTf/c8iRFiPX5dFczKjxUVOfyc2zuh5QTRolkF0ilybsw++gDybX8icFY5Z8OM6pn+leKNZInULpzCsvBF7jd75sMc7JoiW7hphO019TfrjjRm7akGrgDEsRasUrkk6X/stjRZ07T0hKhOA30tz 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)(366016)(376014)(7416014)(1800799024)(6133799003)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?UjkB7EjDDVU00uPEopWNTPa5uIS0xxwO94aDQErpF1/xA32iFRKyzzRBvVJU?= =?us-ascii?Q?yOzC43S6+x6snY7Y8X0Z7cRFx/o1bitTpwIKmPxrCLM39W8jmN1fCUYUKn38?= =?us-ascii?Q?kiix+5PZVpGu5Vdp9kfPRdw8ghBa79UznVf1LYn9rEQw5ShVLuRDmlAM9cNL?= =?us-ascii?Q?58zgWw6VvRcS9gU/RKwCvf1woIYeR7YjIgiNgtaOzdONYBsVXios5Nx2VCXI?= =?us-ascii?Q?mmjImVsvOPd5eUgZgbN4VZ8oMjvS3sJILIu5OdQqqqjR/XZbH9qfHP6czqrY?= =?us-ascii?Q?AW7rfjXjqaGYiIXSLKLJ1KUfy0RuL8La91SfebkVX4ykxmp3Zkzq0Hszg+lV?= =?us-ascii?Q?5YHDQJOJzG5cj/914vF9W7n6z0ib84tm9KvPoFM3x9L0DlCOC8nQWs/uwNba?= =?us-ascii?Q?I5Gmc6ChmMetvIvv0hznQ7PtBKx6SL4I8WzYQ8K3xjN0TBjvER7e4pkFVgpw?= =?us-ascii?Q?93flo8/Z86LYQAd7v2+5aihD7GgewX7ueN52dLH62yckzpPg+v2mnVaBXZw6?= =?us-ascii?Q?tfdOZPYeDyY7EI9R2AnrkBAk4F1+Xg32ezMVm7rbTl/i7tjtd83xgYormMKf?= =?us-ascii?Q?Vuv+9FnrONZ+hgmx4p9Lu+8RH4HyKW4paWAKsENTb3diC2bq398QBzMj9WNM?= =?us-ascii?Q?L3F0ZsOFCu9p9oGLbXru9SjFcoCkazRnIbeAwXJWuiTZgeDqGPcn6F73l7X6?= =?us-ascii?Q?3gSOEXj+mSr+yW6zLltjRG9ApbpIdDDuGIz9vkE26BUzIQ6MqSrwUunITisf?= =?us-ascii?Q?h03C6qJLrbkRYI9YQAi36FE8WFMdVDS9ll0xGb+xXo96Iq6IS49xpNZhoSIK?= =?us-ascii?Q?7FKOJu9sraZv94y5ZyUaAMxt3SYDUPQwQsATlO0XDvb+MTwi0VPf6CfchHjl?= =?us-ascii?Q?svM1q/W2O4sg0tRBHIcs15tIQ/Cm40Yy1F9a497cuQFVQqlF/nyQ8C6dqTJN?= =?us-ascii?Q?RRwlq4/J+kVcny5b+bA1ptH2F/G0oSdYuUUSIihwIgMQDjYZcvnr7AbaflHR?= =?us-ascii?Q?HYbhPTR8vXAXGNOy8nkxkKrnegObJk66JW5vg7SJusX4WLkgQkGE7TUQoQab?= =?us-ascii?Q?ag4rM7PwciI8RhgD8o+C6NbNtvVRt1weO7MKjNPOMWMO4KlnKfvP5spVgzNS?= =?us-ascii?Q?cyHHSkJcBBNT0+r92eAwutj5iOXFB4oua847/9S2HWRKSb+snO3q2sEP2CFa?= =?us-ascii?Q?lTQ+mtlac/yAKYkaXN+E704WmGlps8ck0xkDvEpyKh37SkL9K4xGNSBbBwXl?= =?us-ascii?Q?BxBR0rrz29tvkdonmfI1r6M0TsrbG7iuqXAKvV7DQQlvIbcrj7+7AEeE027l?= =?us-ascii?Q?RZirtOk+oWVJ+NbMBbCkPBBXgUO005wvYt2G72BbASZhrrd/6MqWgjmlQwBS?= =?us-ascii?Q?GhRZ8fyYxNAgzAGet7gFAPct/HO70WGoBYC5gOvaVw50nB0xWs/JJikY6Azs?= =?us-ascii?Q?z5V/lYldK4Jv0/hCkLPyg4PUXvzHm9YS069EtkqhyyeNd5ucQKOR7Z7mkFyE?= =?us-ascii?Q?xUslYKentgEbMZF0a/DlCRsWIbPrV3N+A2DynEFVJBDdpZarqH7ItEi+4U5H?= =?us-ascii?Q?kflumAOu6GemQjmbcgXFXOA8Jq++HlA2jj6wsWf0kVw4HterGZlVuxDeWBPV?= =?us-ascii?Q?oqFP3S1O/EdOHPxJvkAl3BsZW20EJDkNMHH8kqLnzqD2Crg5JzZ6RyhAgyah?= =?us-ascii?Q?jvpfEYvMjy9AlIOyYlsArNm3YrpInQjcL+xSndXuVjG6zO0JrfwAxA3dfoD7?= =?us-ascii?Q?l9HIkkAPCQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: fc4b73b9-af97-4b3a-fe51-08debdf8f23d X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:04.8281 (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: Woss7nRXNwq4HP9gx0nxVSHl7GARCGQ3SYkNHcDLpX9QS4GvVJuPe9pT9rpia9dMvcrm4hVB8ZHwjfXL/u1yUg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" Introduce a single ELF format abstraction that ties each ELF header type to its matching section-header type. This keeps the shared section parser ready for upcoming ELF32 support and avoids mixing 32-bit and 64-bit ELF layouts by mistake. Signed-off-by: John Hubbard Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/firmware.rs | 112 +++++++++++++++++++++++------- 1 file changed, 85 insertions(+), 27 deletions(-) diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index 3aac073efee2..38088e950980 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AF= FILIATES. All rights reserved. =20 //! Contains structures and functions dedicated to the parsing, building a= nd patching of firmwares //! to be loaded into a given execution unit. @@ -467,17 +468,72 @@ mod elf { transmute::FromBytes, // }; =20 + /// Trait to abstract over ELF header differences. + trait ElfHeader: FromBytes { + fn shnum(&self) -> u16; + fn shoff(&self) -> u64; + fn shstrndx(&self) -> u16; + } + + /// Trait to abstract over ELF section-header differences. + trait ElfSectionHeader: FromBytes { + fn name(&self) -> u32; + fn offset(&self) -> u64; + fn size(&self) -> u64; + } + + /// Trait describing a matching ELF header and section-header format. + trait ElfFormat { + type Header: ElfHeader; + type SectionHeader: ElfSectionHeader; + } + /// Newtype to provide a [`FromBytes`] implementation. #[repr(transparent)] struct Elf64Hdr(bindings::elf64_hdr); // SAFETY: all bit patterns are valid for this type, and it doesn't us= e interior mutability. unsafe impl FromBytes for Elf64Hdr {} =20 + impl ElfHeader for Elf64Hdr { + fn shnum(&self) -> u16 { + self.0.e_shnum + } + + fn shoff(&self) -> u64 { + self.0.e_shoff + } + + fn shstrndx(&self) -> u16 { + self.0.e_shstrndx + } + } + #[repr(transparent)] struct Elf64SHdr(bindings::elf64_shdr); // SAFETY: all bit patterns are valid for this type, and it doesn't us= e interior mutability. unsafe impl FromBytes for Elf64SHdr {} =20 + impl ElfSectionHeader for Elf64SHdr { + fn name(&self) -> u32 { + self.0.sh_name + } + + fn offset(&self) -> u64 { + self.0.sh_offset + } + + fn size(&self) -> u64 { + self.0.sh_size + } + } + + struct Elf64Format; + + impl ElfFormat for Elf64Format { + type Header =3D Elf64Hdr; + type SectionHeader =3D Elf64SHdr; + } + /// Returns a NULL-terminated string from the ELF image at `offset`. fn elf_str(elf: &[u8], offset: u64) -> Option<&str> { let idx =3D usize::try_from(offset).ok()?; @@ -485,47 +541,49 @@ fn elf_str(elf: &[u8], offset: u64) -> Option<&str> { CStr::from_bytes_until_nul(bytes).ok()?.to_str().ok() } =20 - /// Tries to extract section with name `name` from the ELF64 image `el= f`, and returns it. - pub(super) fn elf64_section<'a, 'b>(elf: &'a [u8], name: &'b str) -> O= ption<&'a [u8]> { - let hdr =3D &elf - .get(0..size_of::()) - .and_then(Elf64Hdr::from_bytes)? - .0; - - // Get all the section headers. - let mut shdr =3D { - let shdr_num =3D usize::from(hdr.e_shnum); - let shdr_start =3D usize::try_from(hdr.e_shoff).ok()?; - let shdr_end =3D shdr_num - .checked_mul(size_of::()) - .and_then(|v| v.checked_add(shdr_start))?; - - elf.get(shdr_start..shdr_end) - .map(|slice| slice.chunks_exact(size_of::()))? - }; + fn elf_section_generic<'a, F>(elf: &'a [u8], name: &str) -> Option<&'a= [u8]> + where + F: ElfFormat, + { + let hdr =3D F::Header::from_bytes(elf.get(0..size_of::(= ))?)?; + + let shdr_num =3D usize::from(hdr.shnum()); + let shdr_start =3D usize::try_from(hdr.shoff()).ok()?; + let shdr_end =3D shdr_num + .checked_mul(size_of::()) + .and_then(|v| v.checked_add(shdr_start))?; + + // Get all the section headers as an iterator over byte chunks. + let shdr_bytes =3D elf.get(shdr_start..shdr_end)?; + let mut shdr_iter =3D shdr_bytes.chunks_exact(size_of::()); =20 // Get the strings table. - let strhdr =3D shdr + let strhdr =3D shdr_iter .clone() - .nth(usize::from(hdr.e_shstrndx)) - .and_then(Elf64SHdr::from_bytes)?; + .nth(usize::from(hdr.shstrndx())) + .and_then(F::SectionHeader::from_bytes)?; =20 // Find the section which name matches `name` and return it. - shdr.find_map(|sh| { - let hdr =3D Elf64SHdr::from_bytes(sh)?; - let name_offset =3D strhdr.0.sh_offset.checked_add(u64::from(h= dr.0.sh_name))?; + shdr_iter.find_map(|sh_bytes| { + let sh =3D F::SectionHeader::from_bytes(sh_bytes)?; + let name_offset =3D strhdr.offset().checked_add(u64::from(sh.n= ame()))?; let section_name =3D elf_str(elf, name_offset)?; =20 if section_name !=3D name { return None; } =20 - let start =3D usize::try_from(hdr.0.sh_offset).ok()?; - let end =3D usize::try_from(hdr.0.sh_size) + let start =3D usize::try_from(sh.offset()).ok()?; + let end =3D usize::try_from(sh.size()) .ok() - .and_then(|sh_size| start.checked_add(sh_size))?; + .and_then(|sz| start.checked_add(sz))?; =20 elf.get(start..end) }) } + + /// Tries to extract section with name `name` from the ELF64 image `el= f`, and returns it. + pub(super) fn elf64_section<'a>(elf: &'a [u8], name: &str) -> Option<&= 'a [u8]> { + elf_section_generic::(elf, name) + } } --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 6B4F13438BB; Sat, 30 May 2026 03:10:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110614; cv=fail; b=S3n8H4Y0gjuzcp2Mq4vwnpp+s/+6RTxikle0Olbx+h8A8TBDDLzBP/ZY/nj4F9FrJuilRRiZM4vXgJCK93HHnKR33CRxbFM3JJfxx4Rie6ZgbKcCQcj9lXE0rffFXDi8OC4Qi8TKXCpcyEJWiOylparUPitnKMe69+dzqF2dJF4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110614; c=relaxed/simple; bh=ZPvwr64HU1HLsyYJekzJID5lGCRdNiJ6IMGYl0La034=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=OVhASaVZl14lBGzdfkPI9Zg+bQwyiYE/w43XZfv5djoQeW3luNB/NwLWFgwhZuEVVtBiDgV1cb4klnIZJYWP1D+ZUca6kRUeXZHhtYPyZETyWAWzBwCHEESe7IZCM7FpumvRJfWfCU45CBuWleoZeB176fg5QBb7GeIJRUU1CpY= 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=OGoMmwF+; arc=fail smtp.client-ip=40.93.201.22 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="OGoMmwF+" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=AL6ivnRiTL14e9SvEoIo9rODiaMn5xTVMxKD6UkHZL8Xa6Shb1RTIR2tkWn/OmYp8KH4f8hMe+6/z9XWBBJzKN+2Jz/WbYrqkusTnCHNYbbetCVjMe2P1j0VqHvqizaXS8g7AvnHuBi34M0SbWOFE4KVp8LJ2NgCkcdyM4RHg86fhwwEEAZEWcSmB7JJwXGU/7s6qRL7rckYq7dGgmalVwzed6ZcGQLVvTUUBsNesuJs2tPIPl7i05iUb/lUG9lnNqVAERNZk8gkawyjBmYpT6TZqLtSCH1Wkh3BS6CVizCEbnKyZsRT8CiwmBnyF8VkeukUwSrw1+bJ9K8sfIrDTw== 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=ILOPLKkiDd2iRYlapuiCWGTFtncOxXnHo/sbgE95CTs=; b=IdfzRS6K/GaNnIsoqOvVMyB/53FpFtQyMSE70Mc8yHdmSzz4e7J1Q9wLMBFeiSudOunqJe0KI2Xsnjpxq7MuksrzZ+cK9UF2LqhO1SN6/7a9pTjtmHmMBc6gQbhBANY7mFWFiXQ+6l1ouXzym+jdSOErbz006Q7wYZ2xFfNlehlYp6/VI7PAdesdcT31oVR4bVYNwPhQOlNirxVQIEmfTtJWc7WANGElMmFq7sxUxP2BUyKHXDttkmxq1uWUG4C/RD6FenojEFuEvKtGxWCzHJ14J9lLioA/1kP2NN/5EYjlZMCg34+6lGJb60z1H5GvviWHyZ/WtL17SE/LVaeUJA== 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=ILOPLKkiDd2iRYlapuiCWGTFtncOxXnHo/sbgE95CTs=; b=OGoMmwF+cg53v7T2ZSBqhgO2Hbu/YxslevLAoLbR2XGbn/At8Ib85XzuIeItgmTlYipCnylrzZt3G7gW7DGZMPxVxX7ZdF6jEtimfxgVoNIHitEdFBumJnz50N27QUD/aq8F7edos2AEKzmi5coVD8xiDSLIVN1Nu74mH2ng9kqBWNj/t2GssaEaq3kKgAwYpj9T8PJVOJpUcYrdAhoIbuUb4mCguqvu0G7Am32ZVBUDEUiepkasdyZK74vKrifVfrAIbk3QnWBp2tlGfUUPtiA/em0f3RhYBN2ciGO1JCyNBushO25N3x78tQAcDRcjLC3ty+kb2l/y+K4LUmXSGA== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:06 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:05 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 08/22] gpu: nova-core: add support for 32-bit firmware images Date: Fri, 29 May 2026 20:09:39 -0700 Message-ID: <20260530030953.740561-9-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY1P220CA0041.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:59e::13) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: 532c6d8e-cd3d-4b27-278e-08debdf8f2db X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|6133799003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: C+RSV+wpT2DX/lIdURjBsrPlTzmoecsMhl3FR9pgGgmuCkP3d8TMxkD7s69fPg2MSwFSCIGIkcgZQDjRBLz15BElkvdTlksMTVnPeoSVJvsVJG63kPaifmy+mIVtsv+PFsd5ifYEwr75Elip9qM1S/pO8r1y352wr9ySbKS8VBz0eID+fgMFktOuWBqg8Vsg15uYNsSmF3FUUNdMkpM8309ZUtjg8Ds2ZKwNoUR1nhrPP2C57wtQmSCDYnT/HvEXBXKB6667H8tdMlTWz37wP0n00IZYtDzOKTtTj+UEKt6TtnljTTyH5rhK4peNC5JwtHxXzt4+SISy1sSap2Ek/JY4aAC7AIEWZHUSKEcmZarvdsBKK4HoNp+Nq0/gVUmPxp5h8+XfvUvS+4toMeCR+NHPHbhaKvoTUw27CAuGXGBNaV5yM9hxwsCcY+OoIgc3zqhy1eXjEjYT5c0kUewV9+gbhvEZb7C7ygwki6Ru7Utvtd4O6sKv4n3EK2IVD/y84tIvQqstDNsRjjsmCpJM7LNJs0XtLYSKPCFoTj7AmbVb0up4ld4ri/Wq8mkncsVrlKA399G0Kk4mGWDmpJ6s8Q8GMaOhA+0/QUUldkOiSUUeb2dmyipARu8Pm0AG6kB+Tfv2xE+8w+Q5/kqnIYkv0WwE1R6h8+s3x04lf2VanKnpwC6w7+5EJGOe6VocPL+7 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)(366016)(376014)(7416014)(1800799024)(6133799003)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?bjaSk8T+K3ELJnXixERXiX9MST2MjZVa3zz2r/RmTeuI78fIb/27RuBk3sbj?= =?us-ascii?Q?K+MRcLB67nNrnB34FI/gzCGZGPgzEfhaC0IIJx4dYZtd5fQT4UXNFs3um4yy?= =?us-ascii?Q?itm5/QjPct2zZt24Tdfc0TdDvp/k7Ht62uLPmZnnXucDer9s9gc0cCQex1+z?= =?us-ascii?Q?GOaGr39570HLsakwJkm9lkd3HxDSVoL2PBDw12WQI7VwTxn9m7Rnh6E1HDmz?= =?us-ascii?Q?n42MPYLdUSnUvSiT1aNzfHqxOYbHk0RSBGBckjy+gPTJf5+/M69qIFnpGYBG?= =?us-ascii?Q?e1N3g0TfNvcdOlYn94hOi4QAX2Y+9NF5tKexwOLGYxnUu60eJjlRy0Ax9ISS?= =?us-ascii?Q?rwpL1HKGUOLWAAvx6lz3AhycJdiNeHknnrLY8j4TsmHRmEZqpF0Wsergm/Fm?= =?us-ascii?Q?TrJuFxvZhYxXxVl/4umxrqpl32OgU/OHdZQucv7dBOGU3lFbAp2JmNIHYcPp?= =?us-ascii?Q?cfItW26Wv/M/+FybZZ+FoGyv5Av3b3h+XqwooBhve8g/TWSJl8ateD8Y6vji?= =?us-ascii?Q?3W/pf8LJRJ7+oseoWhFu614IQboyEjUIwkpiKqGCqgTAAe2LZmcBkt6+coIM?= =?us-ascii?Q?rBcp8BLq/e6CeE7XtJ616ic2vOB2TCkGgX+U+QsqCi/eSFgr+vKHNUUcxvcy?= =?us-ascii?Q?0WIE4BaSQ9p2dE48zVO/5SUCKsjLqnGAJ/10+2tQa9zCNS5dX8N+sQgK4/dA?= =?us-ascii?Q?lbK+UbHoT4T3eSC1lgg93KV3yRkLkei03xHcZuoWKfNvMlQ0E51xQRRW20yj?= =?us-ascii?Q?ejox09yZWUHpZAXlPWRa2OQMkfUU6cvzvZ6GBmTDUOCiVmzk64xqJ4KbZXpL?= =?us-ascii?Q?+rA2Vgc7yu5neoOJfoxkcfCzy6heh81kmphhkM5HQT9mt8UjHQnyj6y741Hk?= =?us-ascii?Q?4ki9UL/VAMTebUm+dcx4dZKrZzkltMx3o9l47llyZ3clNkmD4Nj5GB0lzjwI?= =?us-ascii?Q?/th7eKTltTp7MzbWaUtqDCTYQH2tx8l8yz5HECfVJc/S5jVZUb5zCrm1IPV+?= =?us-ascii?Q?3YEH0MbgPqg+ufjgpb9/+eH81WTymwoMI5Dqbegxrx8tx6QRV9rIR8lmjIzd?= =?us-ascii?Q?OJbiHyGpCeABhVcbFo1os+gvKfNht+oXGAHFrgJNDZ5UEzPJi/0lgI3h/Zii?= =?us-ascii?Q?6m4xsNGN/kjWhTem1wgBxRRWozrR4aYP8y++4+hd5R1fEed3l2So81DVQSja?= =?us-ascii?Q?24uiS8ApKe8d53+DtFkW1R5lOCADrw8mHPf3AzNFltfw4P8xeU07snou9y4F?= =?us-ascii?Q?XfZdyUagXkbyzM7typRvhMH92h/XjAUQZ7SuEmNxG8xrHCT7HKsNRaNJWxGc?= =?us-ascii?Q?knsiMQKWI1J4ONYTJRl4T/FPNascdjW6fCtQ9JotpSHCURtQ7Z7lga+FHk9w?= =?us-ascii?Q?obLz+jfJAZ6GHL+cCxuy+tz0inNOWbonpXGBqXzXpceDCtkYtcYVEW7aKVwK?= =?us-ascii?Q?Z/pMcDqXGfKBCgxtWhJ0NPT4ExQe7ou8WMlcAdYhl7FudAGBtd0LhcLH0gS3?= =?us-ascii?Q?DoMOrWkUzMsIjU/nlXkQYSj4YUEhDD8xr+E/uUoW8ltoKJ6wJjay0hJW4yHx?= =?us-ascii?Q?16LKmgu5Bv5ciNb3ZN4mcOqm2lqVE++UShVe57NjKLj9Do9/89N1maIUfhLi?= =?us-ascii?Q?2VrLqdkkcpemQ3rK5vrl5RAf9aybLtrwxLDZYWJbIzPBbXGmZbMXoR9+iZ1f?= =?us-ascii?Q?YBU7CSVPXWxP+6ckMgJfPTxKkj5YjlVrnKUzg+dqIP2M/wV8sZZ2EsG2RoFd?= =?us-ascii?Q?3pXkESVpUQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 532c6d8e-cd3d-4b27-278e-08debdf8f2db X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:05.8547 (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: nwkn49l++9RsH2K4/hZuIblzT8aWZ8y7oKpJitCdrSSX6pPZ8FJ7RG4wVXrcwLrKx8uk0QXJMyZ5qN530Fys5Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" Some GPU firmware images are packaged as 32-bit ELF rather than 64-bit. Add a 32-bit implementation of the shared ELF section-parsing abstraction so those images can be parsed alongside the existing 64-bit path. Signed-off-by: John Hubbard Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/firmware.rs | 53 +++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index 38088e950980..e4dcc9a87b7e 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -534,6 +534,53 @@ impl ElfFormat for Elf64Format { type SectionHeader =3D Elf64SHdr; } =20 + /// Newtype to provide [`FromBytes`] and [`ElfHeader`] implementations= for ELF32. + #[repr(transparent)] + struct Elf32Hdr(bindings::elf32_hdr); + // SAFETY: all bit patterns are valid for this type, and it doesn't us= e interior mutability. + unsafe impl FromBytes for Elf32Hdr {} + + impl ElfHeader for Elf32Hdr { + fn shnum(&self) -> u16 { + self.0.e_shnum + } + + fn shoff(&self) -> u64 { + u64::from(self.0.e_shoff) + } + + fn shstrndx(&self) -> u16 { + self.0.e_shstrndx + } + } + + /// Newtype to provide [`FromBytes`] and [`ElfSectionHeader`] implemen= tations for ELF32. + #[repr(transparent)] + struct Elf32SHdr(bindings::elf32_shdr); + // SAFETY: all bit patterns are valid for this type, and it doesn't us= e interior mutability. + unsafe impl FromBytes for Elf32SHdr {} + + impl ElfSectionHeader for Elf32SHdr { + fn name(&self) -> u32 { + self.0.sh_name + } + + fn offset(&self) -> u64 { + u64::from(self.0.sh_offset) + } + + fn size(&self) -> u64 { + u64::from(self.0.sh_size) + } + } + + struct Elf32Format; + + impl ElfFormat for Elf32Format { + type Header =3D Elf32Hdr; + type SectionHeader =3D Elf32SHdr; + } + /// Returns a NULL-terminated string from the ELF image at `offset`. fn elf_str(elf: &[u8], offset: u64) -> Option<&str> { let idx =3D usize::try_from(offset).ok()?; @@ -586,4 +633,10 @@ fn elf_section_generic<'a, F>(elf: &'a [u8], name: &st= r) -> Option<&'a [u8]> pub(super) fn elf64_section<'a>(elf: &'a [u8], name: &str) -> Option<&= 'a [u8]> { elf_section_generic::(elf, name) } + + /// Extract the section with name `name` from the ELF32 image `elf`. + #[expect(dead_code)] + pub(super) fn elf32_section<'a>(elf: &'a [u8], name: &str) -> Option<&= 'a [u8]> { + elf_section_generic::(elf, name) + } } --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 22EE4345736; Sat, 30 May 2026 03:10:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110620; cv=fail; b=Vs3b5x3KF9jInPdyQPe56D5t8oTZuLUpI7SWMABSDpr8Fz0/9RvnlgEpZnWYuEO1JxYOtkBIKgSwa29g7O+71LGs6nrZgBVZFOzZcQR4X3kFGg9b2Ez5OXR3udLI4D49GvdqW63bgc9QL0j3XnB7lobiRLHnJF+rcZS3HIzzH+g= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110620; c=relaxed/simple; bh=kqpYlBXaf8TNHSIHP56HM0cUMVNdKOmJiEKbqjL9fCg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=cd6jGF9WGDOzYggaui4K6J2VW8DSrm4wffvrq4H+mDVe/AflYcZ8NF85v2L8Qrkdi9zMWY6kE/7FUgkxE+9XR1p+vwpMEaODfE4kJjtSWyjL4SQLBdVXpFw1+wTktTQA48MP2v87V3BeZIDtYehM9OPHJIoHQMMDnw6mZQneNh8= 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=XjYgjQEd; arc=fail smtp.client-ip=40.93.201.22 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="XjYgjQEd" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wSOoKoVqkU2/hQj2CZSCQqP4oIR/Xf3s13non6Ixcn4dr/VakHMfESs5Ab9z+PYzZM00j/uHny6TMa+sqF29FAJtGx/bQaqJw7u7Vg9rCBt6A2SuIbuYP//xFElyX2/5uY238dPqC+jkJ0rD7+IRTHV1Zzvv066ZcF2K8GsBslBZc4EIyqp3hmsFAc+WMir5uPzp5USu2S9Ctx56QzTPUOHHzTllv0EVmkrYROCrvru518MJm56xqwcQDkTWdJIE+VrsnOZDfmxhjz5KDd0oVNmw5lqAnCycHGg14JgkCkpWB2Xk+91ACtJKiPHRM0noxJCLaTX40dauN03vW6BZ2w== 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=xQOfVeuQtqctR4b+6XjGh6EqR07J+YFbCA4nKv5+p2o=; b=SKHWyR6+jPsh1J7MG28JfJefEaPXtSMbFMOjXsWU136BUFitB65niRWf5aDueQpURbI70hlWIJ1DA1WRR/wCfxfzr5Wx2ka1DB+XskJjK4m7AHIctXhraQCB/jGb3anMzV7zwIHYL+83AZq1nW5budu/YkjfHBRuZIZcASdyAqKh46ILv6TRBOzfKGEsj5Y5z8/UnIwi9aOS5NrIKK2RnAtxiZtJJPaJ1kwZKcDgCd1OocGMr+jpTSSghjT5bwPrxmyokroQqjG23LTzke81puKVFPIRO9jvaNxmNXspzJkSJ0Xv8UklZ+sdwsjJ6xQbLAaBLi0wmB82+gwq9+nZFA== 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=xQOfVeuQtqctR4b+6XjGh6EqR07J+YFbCA4nKv5+p2o=; b=XjYgjQEdjIBLgNvE3IGuheTiI/NTfdxhtBPjRo9oOIJamBHAnM122TkyALsTN6UIoJI1rzkFIPwOvfaKlo481W78wE2Xz7Jvh9wnrhZf/9IHNtz8kM4x9Rvosy7ifoa6MiqOXg7mqONIP7ODZjywCZ8XydyglqZVN+PiUgXNQbipWEuveEaWjOWxZb6u+GKYb6RDVo5bBGK31hBF4FVhx6wnWsDitSuEG7QitvCcENBhOUAE70xtSb9TOFdG7hC8NJuXMWVfMfPnzivaeBZnMkkTEL/m8rhkD+s0pqt7H5L96chOYFI/rYjRe9DiecW5MI/hiurhfCvQ2qoJa2mo1A== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10: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%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:06 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 09/22] gpu: nova-core: add auto-detection of 32-bit, 64-bit firmware images Date: Fri, 29 May 2026 20:09:40 -0700 Message-ID: <20260530030953.740561-10-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY1P220CA0039.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:59e::7) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: 09795c18-03f0-475d-0a20-08debdf8f37d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: tChJ4d8UOfmxTIPo9Ii+/+tY1wHZ0WzHzK6ULmfAhQVKn4bgaYGOGmH/mhe4CYTxLZ9VO0LJfIUQ8DZJCciXEcaXRYIJ9CJvW8zh9lfLWKnrimnedw0ldx7DcuxkVZveBJqNmIn/5BKD73N8cUU0laf+9fq9r8Gmf5BSJ0I8RjtSBC9Tu0EAABWKKPq3TaHtTDRtmbfo6ndmW+7a66huBS4xQMY5Ok8d9SsN11lAwpqTY3jzyHnlEkx7NrBg9eYpGADVgM925VkIkiejQbGtu+cKx5CnVB/k8J9NA8ix1bmfiO+OMNNvpoj9lGv8yeC8yX8zfrGClSdFDJkkHJrN+FHNDVBYqfxrQ2tHIUvhoFy4Ye1aOfNF48S1YYxVaArObudEFtQ0rFqBDTi74x6SiEY80v7y6q3WKMlnkCyxL4jLvRtsY09sFoA2aDiqok7lR220B/8KAS7J31QYYr5EyFlUdyNwVKMaGESneUJPLgr5doMHidVMrHpKkLg6mOa/p1DOYEVd0G/tC225iFyVeFRi/+GseGdIcRS8EbH+oxsQaVcLGJyhsOdmzzvV49viGYycnOHZh3/PwgNoKf64PwAyyvtIGWE3UGW3iyMNIZnopqWqdrt7ZrtJvPWn/UHuVnuzS0t2ybWwjLL58DweRG2uMJtnzR2TgftJ92kqDLKvzX+ChzMHiY6wPLkl6FAu 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)(366016)(376014)(7416014)(1800799024)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?j6mcnsX09UfccUrAhFbY/BTNl2zhveyfW8gQutVYIdK9odMSQy7vFWAc3OWl?= =?us-ascii?Q?+YNab1w2oTZ3qgn6L2RJ8ZeXBJf8XwZbkuP2LryLDr4qPvcj+ngD59XSXSip?= =?us-ascii?Q?d+/1oesSrM49UrIjRuAbQhZAon3JGcYoVp5Zt8JUOjCO4qF8/Iz9TZb6vKF9?= =?us-ascii?Q?t64eUr47/hizVpW4KyAIg/PAV+RmSugfj7PBQsACFdHp7iAI7nZKfsGIuWLP?= =?us-ascii?Q?d+tiKJrrc0TyfwGqihhUOF2OPxtDvOzKdfWjSdByewSZneQbb5kXV5oYv2vF?= =?us-ascii?Q?uiohEV4tHcBCq5OUSztxDecxvxAF/8/nTFj9LA+s32K3H8o2zICR8TB4HgWB?= =?us-ascii?Q?WHhf9WgNoxo3UpeYiLC3tIeORFEAdgVo2bP1z5sXxgv9Cl4vYH2YxQWXH9l0?= =?us-ascii?Q?p0QVXmNKBpYZI9NlBASeXPcoatAsaOfZ5e2tsgEOMr0fXoMilitXKk/AlbQb?= =?us-ascii?Q?PIFuREqPZhB55Tn28jHgaqxaRFr4otqWu9duBFXN6p/iprItehyHZxKl8Z1L?= =?us-ascii?Q?YmrZx7dUEOIxx4v1dvgHI7Hy0RkoZVxSiChRoxOnfANPydUB6PgfHLMWXzUC?= =?us-ascii?Q?I+UE0eFFndmlhhEUQK4NtuKJURyCYTtFThPYbFXMiQxDpexWxSbTXFt6gWHQ?= =?us-ascii?Q?b1ShJNrrutUfVOciAdPXeibM/Obbk3HyM+4HHcb9A8Pzjbk3K2BNCFaa6P86?= =?us-ascii?Q?FT+MeT0Bv7Dm323+w0DtQt5MrxYZDSMkJC8jCvJ/uepiCDq6SZaebAwm0+c2?= =?us-ascii?Q?uykJnHJCFpGqo+LKWmsncl4ypaeBe+noU+/KnPjbVhFV4qO0v4HGWTmhi60S?= =?us-ascii?Q?1YDdVW9LSLXovsN7JT5zeb+Bdv4t71dNgSvi4HKnLgt2uz7WaaWpUwIPjzt9?= =?us-ascii?Q?ywYjYWf7IMBFFY2lcsWjza8a78Ar9bDu+K5CPqHVQ5F7gEpa29tQBQo3w557?= =?us-ascii?Q?Gl2oFKP50Rw42dKHhoEKPnmlLsM61kf73KLRNoDaZuL39vy0x4YWtXgMzZjK?= =?us-ascii?Q?dYXUlu1PaGo4ucZrIbBDUqKx4h83Q9fY9r5c/xn70bWcZ1C9cKHU9kyCHro5?= =?us-ascii?Q?GR/xINK1MfvNP7DIoXs4h3RTaGCwpwZTeM21zqU+klrVrhbNf8dHzUFLbXkn?= =?us-ascii?Q?Hblwa0GvYi4VMgX3iVR/EQeLUSZ2X7swgEBQoRULO7FPkeiBR2GCANfuyFpj?= =?us-ascii?Q?bJzv4khWXAXgi3ndOB9y51kwa+XJakLbOlybo7Oz2wqezTlOjfbe+K+ULyBo?= =?us-ascii?Q?y5h4QdOosHvi25zM1e3/L6nvaLEx5SwDOk6tbt8aE+fqp9ymD/S+d8ZAqRiT?= =?us-ascii?Q?/z8o0aawjNwABUj3k4Ar8+TzIy2+ZIe2ABc739qVoN/QDb8+Ifkr2586R0Bd?= =?us-ascii?Q?h3987xvOcjNzhBl/5FEFlnkHkfbIqAk1WEFg0gejNf7KdbSPwH6k1Htumjs9?= =?us-ascii?Q?g/pNtPqZT8nnbOR6gJgHGUyltCJv6Pl06uxpmL061SrbASSGKfw0H3ne0iFY?= =?us-ascii?Q?ixoCC1SfOQ+Rnf6y9F4o9sLwM/2aQV1T8BL1joZhNHZSpXjBRmDJtPppd6Qq?= =?us-ascii?Q?9sAlu0H1aHbKmFj6Gy8vQFIm+IK7hDNGlzjHfa+vlq8lfvSvUOXGI4DytfzV?= =?us-ascii?Q?SXYyE9tndgud+LWQUGehtYmhGXSVt/D5BR7AbcLh5VVTsIlWdDCSQBnSK0Me?= =?us-ascii?Q?WNYXw+8e/7myxir884LPC68iMbfLcja/xliq0NkHp5HAbzlwSUlEaHfjtdfy?= =?us-ascii?Q?+jsd15js1w=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 09795c18-03f0-475d-0a20-08debdf8f37d X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:06.8985 (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: 8oaVt754rhRd0pY8pJUTbjMzjZoBfrxQSaeshM8WdLChoeUwTh1dVNzcgUtyCXf1YAbsmny/ERPqzhMQWZwrQQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" A firmware image may be either a 32-bit or a 64-bit ELF, and callers should not have to know which. Detect the ELF class from the image header at parse time and dispatch to the matching parser, so a single entry point handles both layouts. Signed-off-by: John Hubbard Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/firmware.rs | 22 ++++++++++++++++++---- drivers/gpu/nova-core/firmware/gsp.rs | 4 ++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index e4dcc9a87b7e..866bc9b3571e 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -629,14 +629,28 @@ fn elf_section_generic<'a, F>(elf: &'a [u8], name: &s= tr) -> Option<&'a [u8]> }) } =20 - /// Tries to extract section with name `name` from the ELF64 image `el= f`, and returns it. - pub(super) fn elf64_section<'a>(elf: &'a [u8], name: &str) -> Option<&= 'a [u8]> { + /// Extract the section with name `name` from the ELF64 image `elf`. + fn elf64_section<'a>(elf: &'a [u8], name: &str) -> Option<&'a [u8]> { elf_section_generic::(elf, name) } =20 /// Extract the section with name `name` from the ELF32 image `elf`. - #[expect(dead_code)] - pub(super) fn elf32_section<'a>(elf: &'a [u8], name: &str) -> Option<&= 'a [u8]> { + fn elf32_section<'a>(elf: &'a [u8], name: &str) -> Option<&'a [u8]> { elf_section_generic::(elf, name) } + + /// Automatically detects ELF32 vs ELF64 based on the ELF header. + pub(super) fn elf_section<'a>(elf: &'a [u8], name: &str) -> Option<&'a= [u8]> { + // Check ELF magic. + if elf.len() < 5 || elf.get(0..4)? !=3D b"\x7fELF" { + return None; + } + + // Check ELF class: 1 =3D 32-bit, 2 =3D 64-bit. + match elf.get(4)? { + 1 =3D> elf32_section(elf, name), + 2 =3D> elf64_section(elf, name), + _ =3D> None, + } + } } diff --git a/drivers/gpu/nova-core/firmware/gsp.rs b/drivers/gpu/nova-core/= firmware/gsp.rs index e576bc8a9b1c..99a302bae567 100644 --- a/drivers/gpu/nova-core/firmware/gsp.rs +++ b/drivers/gpu/nova-core/firmware/gsp.rs @@ -88,7 +88,7 @@ pub(crate) fn new<'a>( pin_init::pin_init_scope(move || { let firmware =3D super::request_firmware(dev, chipset, "gsp", = ver)?; =20 - let fw_section =3D elf::elf64_section(firmware.data(), ".fwima= ge").ok_or(EINVAL)?; + let fw_section =3D elf::elf_section(firmware.data(), ".fwimage= ").ok_or(EINVAL)?; =20 let size =3D fw_section.len(); =20 @@ -148,7 +148,7 @@ pub(crate) fn new<'a>( signatures: { let sigs_section =3D Self::find_gsp_sigs_section(chips= et); =20 - elf::elf64_section(firmware.data(), sigs_section) + elf::elf_section(firmware.data(), sigs_section) .ok_or(EINVAL) .and_then(|data| Coherent::from_slice(dev, data, G= FP_KERNEL))? }, --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 87B7D34575D; Sat, 30 May 2026 03:10:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110629; cv=fail; b=HIrCtRHdRLNDC80JEroiALi3vDfI+lw79tu2OppE3Ub0k7uteblV4uXdTLOpVLw6VXHrvSt6TTxLqyllx1A5nD/d9xKXb70spoBJr0fvm/UWt/24uG++0hWVs05qaUsZc7AaQFbb15ztQTinkQIodqBUc38fUHlgvf0jLL6225Q= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110629; c=relaxed/simple; bh=fEmOAB1exUEiy3R9sF65213T+PMvL/9C6gkW0gLRH5E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=IkdOAJIjbI1Ipi3k5uXH3j2GSCdb1f42G7DrKMILBFx25RlHk/YK2Dne/R8CsxhFpfbgrfb35QopQmX7RLGuVUYeE03P35dGWCUWNIfLSkaacbVFc6qOoJ3nd3C7SG5pe/gsVb9gVWIXE0qSQ9kJaGgilBCH1Q+IDjF1++SJGmM= 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=BmvW64/g; arc=fail smtp.client-ip=40.93.201.22 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="BmvW64/g" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fa+lZS4BGUqSHp3xKUcUvucW5W5JB+SE0S3jOgqqSZwbj0JVfFVItm74DRxHy1KtPuhA/uPyuuIiseKQ3ljr9bIqwPIHnJoqmpooWgEg19tQrpboEtOvgKYCKfj6ohDDd6nyAfgFBynrCNAnwiWkLhF0ooN9NYRp/b7XeuYVyJDFxj3eHGIxBcEYca3ckk91XizUftGL99U9rwQTDVJ9+Xw39mNcVFiiQZVXNIpKZC1pHJ0c21Xe8g4dpqaehNjjzjNcq0cz1OeK3J1Xj4bQHm3o7gJEpArXHFgt58bpv2LLoTqPFWpeMngt30mEY7kmqy2wxSS0Q/zeWZiYRzOcHQ== 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=26Ex6Ongx70IwjUTLvB2a0XSXMQiCbu7in7fAZmqtE4=; b=LQ4y3Q/jA21tJfxciz/oVVc0JOWiDfGkJM/vGRIt+147YuLnSxfwVaNqvctw3CVE1rdnpDOBYVfm7HBqzWvjK7y2R1b8i1J/QVz5hHGmrzpF+UqNRofntclsZchGfzucnplo1E/AS4JEbVfgwuIm5XV46a6tmKcSPAk8uhLK3AKThY94WZ86ahCZRIo9pYneKuR7xCNoW6uXj0iUPaZXgrZ1RV3qcASrKz5PUS/7a/S8ngsoZKmRgwA1NiTiRvfRyvSEXifmcevYgFJi9yVvmpWp6ql5cRLEChNeSJvaVchm9t4WYCW7arenhHzDlgH4L8vFdsmUWlzr0X2eHx4Z6w== 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=26Ex6Ongx70IwjUTLvB2a0XSXMQiCbu7in7fAZmqtE4=; b=BmvW64/gf8wlPK7Nq8Z4GK0RcKqqVlFgigPFyp9rABvPeICQLTk3rFEBHsjJWo1MhanP2YTP8lTgl+8c0w3LbZ3yQSAPGo5jV1VL4DUI2ez92sFH53X/Cc+1XynJ7djZVdf5vTsUQfBLC/tXTi4ZEqVmxRfTcBg2XZI75/FYbHNVvBgp1lr47aG5xYL3PDZKsKKFvwaa8g0FLW9DL5IRGOeznGPsgTNaPweAgH2h07xRlFUh6NEohyRhpq8m4GpFk4uQMsVpQJY2K3SW7cU+0VQTkb2g4uezYe+n3ygf77d1MvOG88FW/GI1yRlkPD/CuHWviFWq8KLp5QVjBsZxBQ== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10: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%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:08 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 10/22] gpu: nova-core: Hopper/Blackwell: add FSP falcon engine stub Date: Fri, 29 May 2026 20:09:41 -0700 Message-ID: <20260530030953.740561-11-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY1P220CA0049.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:59e::15) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: 602ff0b4-7f0f-4604-fbba-08debdf8f418 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: Dtg7MX79OAe1qT8vdB7LJFCjXNBsEBp7G7CfRq/r288HIBiCrGH//yu7Kqoymme8AWOhY7RTKg45dej58w+ShyGiagL12yDfEMhfD0sODIZnCU1/4AKASChsi+nWWS3yjVVyH+QBpWUOpZ+Igz6MLoFzWYpYtNJwrtBttyNKSrBa47M0gPypW9JDXmETC76sfrH0ayQUG2CkTUA+sZ+oi4MbRVFStjJlSEFHznr1y3+38w4NZ0IEqbObwMrCQQHXx9hDglw4MqnWP5hBb8/oNsIORjfzLQBW8hEAodgkW+ILlbzUmQ7OmNE3Arty7Vs+HYlflMNSy2psrAzkPxHjGQNTQuxdm0dECZcJgsWmpSbGNJx1nPgCvjluyighmpPxf4900b+AOjiqcsLu0vwU3eggsgFs0b0EyN0prB/zElJAooHpbiHuJBfpnX001rCDRJlxmG4x5yELl+NhRgPcMSnaFkkbdIOjHY+TUA4juPZ1fzZkwUcBb0QrqX2zRs+qHkL6YMXLX6QNhClg+N7zti2Ae38sg5rQ88iHfkpb4qQMd+vSTrrl2a8ew2SkD3CMrVhaCMtUB9I7ndTahqHSiaQWUmLrKczQhcPsYvdgVxW/Hw2le2ptoiwbG/Jl90OjpppbaYVXieQzP69GB1z2Ljys/CMijfAXEHYpkFcmNavZOAD68hYtey8eOmhqk+TJ 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)(366016)(376014)(7416014)(1800799024)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?CUVFhGAEvvXv5EB751DCAS1/wpc+y58osimWyjd3bMlWm6Hy+HhbWXRtbhxB?= =?us-ascii?Q?zqpyJuVGX21tr0NPlKA2mKvbb9Q48t6LDJfKw3k8gCqSw7cJrKBgvOXVmJZx?= =?us-ascii?Q?Jai4Z7bZ5Ky0/1hSi88YEXRifyRhNkVTLzoFTwj9m+m9NNlq6wcbvdZGO0xl?= =?us-ascii?Q?kAmR5lutaI+4BuOm3u3zjXvRETmUXH46LPBo2VrTAb+EzJjRGNnOoN8iMwYg?= =?us-ascii?Q?LDPEyz15GthimUcJNCSv634NbaZhlUlRyKtm+y0n6Mgm9qMK/6sSujo5Hy0o?= =?us-ascii?Q?t5QF0Ii6I+CcQp40mERlv067QVkK4hkgUeAyxJHwyFZRP4ev4G0myMhXg4Qm?= =?us-ascii?Q?jtC2rtPRqbqRovOBLyUusR8HSfMZ/ajmGoCEz6tSIJgAF+3KSUb2eim1ji9V?= =?us-ascii?Q?MBAtNGnEbixgVNSnDiaUgYSu7ximzYWKHCKGe8LozV5NdNWKFtsD7UCxOkqN?= =?us-ascii?Q?3d9gaCjpH5zqzbuqVp9vVjCBpsecT2wLVqzztAuvj6+tNsAlNzjDuxB7n/V5?= =?us-ascii?Q?sVazybzr+9DC/hTFJq5KbwAKSwpccFG0sWJyJP4sZFLYgM5OQAh7bLK+Rj5C?= =?us-ascii?Q?ekSnhIG0kKp25yOYpJH86YtEe8K3RyN44t4uMbQwTeSyL8tC3BWwtX31u3R0?= =?us-ascii?Q?DznQt3bwj2mlBYmlQ+iEJFk/jXh37GG1tafqhdM5vkkVR8nFUl/KMy01WVfL?= =?us-ascii?Q?gppSlxuM1giLYIsQGrpsbVxVqOR06ble9sbwoE6UJVbJuweIuowHhKOznU7g?= =?us-ascii?Q?BlCOOBvnrHxGWQ44aoVhJfgpfkIqrznULUS5yRGrcSlhDnBMvCFOS4OQLJnR?= =?us-ascii?Q?oeU5F0/wkZVDpspP+97ZK0FK87QuPkaSGTz7dnhivtxbgN1ml2k8mf7jQCvk?= =?us-ascii?Q?7ICK85q8CvgenyEYZZX+bovZrKpJSWHfZJYxCUyYgKJO1GLb9BY69tKMx+PY?= =?us-ascii?Q?vQkv6iJKTGNMImOqU3NmhqIKQ9zSVvch2Gex5rprKAuLmNATUAXRpq4IhOts?= =?us-ascii?Q?OTF85hxjTcsdGaNnIGN7V5lQyCLCv7W5hr8OIqBmTm+osvTYFwL84nUb9rfr?= =?us-ascii?Q?mjycqE3a1B7Zf3vobgDXnWItDagka6Nn8IgBeNSfMoS9daYtxx4iVqItsPoH?= =?us-ascii?Q?mY62hOY2IfgxZDp1bbEuWIvTPGIA4QvHiOvdz4dH8QRnwfS/zWRlQNQccJ9w?= =?us-ascii?Q?oFxjrphXbhMfDa2ro3IDJLf0WgUe59adw8ftNeyYg0vyaZnEugzyxRcrCJG7?= =?us-ascii?Q?AmkzdMzlOR5LWe0IGaWFXzj16kMGY/RiSNWtW8ea9FEn1+Hbpc4DpFXwZaYK?= =?us-ascii?Q?wxDMqIvDoE5RC+R6yH/UGM6urAmNh65B3VE1UQpYySOPOt2uOgj3XmVIi3sP?= =?us-ascii?Q?ttS/bbuKvWbfZjDnRlO3Y9QHFMNk9zwzkCozPcQKS8liva+QXFlBaZWinsEH?= =?us-ascii?Q?cp0/hl3VfN9bicXD0mqYH03pTcugtGIzNbpd2Mcsth2slKi7HguD/xQ97G+g?= =?us-ascii?Q?ew74oMFuYtpD/TQ7aqlQcotKAjmmF1PzSZVR34aFjfdn+bcj+oth1Lz/vxqg?= =?us-ascii?Q?ROv3bePXEdt+vZx3LNWJOw/jUbt4NTCWijcFl6+2J5Rp3fAoVLbyC/gLJ2s9?= =?us-ascii?Q?1CAR9X2Etsp0LQEiv700A/49wkY8NWlqu5GtuNaAGPGSyvgwUT18zALR/Wzt?= =?us-ascii?Q?BRZ1VLWBl2K2TdHbLE6K6lzJqDgSfQ1TczT+hbvlkygAGQoZQNkud4E/ta4V?= =?us-ascii?Q?nuWwZSF+kA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 602ff0b4-7f0f-4604-fbba-08debdf8f418 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:07.9576 (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: ++M4OA61ndtGaog6sXzM1kouc9DXD66aYybv4JKQAI2uElrmw2Lj/PgxVSaa84zehoMLHgw3IInm40Yhsz3shg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" Add the FSP (Firmware System Processor) falcon engine type that will handle secure boot and Chain of Trust operations on Hopper and Blackwell architectures. The FSP falcon replaces SEC2's role in the boot sequence for these newer architectures. This initial stub just defines the falcon type and its base address. Signed-off-by: John Hubbard Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/falcon.rs | 1 + drivers/gpu/nova-core/falcon/fsp.rs | 28 ++++++++++++++++++++++++++ drivers/gpu/nova-core/gsp/hal/gh100.rs | 7 +++++-- 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 drivers/gpu/nova-core/falcon/fsp.rs diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 24cc2c26e28d..053ce5bea6cd 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -40,6 +40,7 @@ regs, }; =20 +pub(crate) mod fsp; pub(crate) mod gsp; mod hal; pub(crate) mod sec2; diff --git a/drivers/gpu/nova-core/falcon/fsp.rs b/drivers/gpu/nova-core/fa= lcon/fsp.rs new file mode 100644 index 000000000000..73fb73cb73a5 --- /dev/null +++ b/drivers/gpu/nova-core/falcon/fsp.rs @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! FSP (Firmware System Processor) falcon engine for Hopper/Blackwell GPU= s. +//! +//! The FSP falcon handles secure boot and Chain of Trust operations +//! on Hopper and Blackwell architectures, replacing SEC2's role. + +use kernel::io::register::RegisterBase; + +use crate::falcon::{ + FalconEngine, + PFalcon2Base, + PFalconBase, // +}; + +/// Type specifying the `Fsp` falcon engine. Cannot be instantiated. +pub(crate) struct Fsp(()); + +impl RegisterBase for Fsp { + const BASE: usize =3D 0x8f2000; +} + +impl RegisterBase for Fsp { + const BASE: usize =3D 0x8f3000; +} + +impl FalconEngine for Fsp {} diff --git a/drivers/gpu/nova-core/gsp/hal/gh100.rs b/drivers/gpu/nova-core= /gsp/hal/gh100.rs index 9a4bb22578b3..fe2689764c8d 100644 --- a/drivers/gpu/nova-core/gsp/hal/gh100.rs +++ b/drivers/gpu/nova-core/gsp/hal/gh100.rs @@ -11,6 +11,7 @@ use crate::{ driver::Bar0, falcon::{ + fsp::Fsp as FspEngine, gsp::Gsp as GspEngine, sec2::Sec2, Falcon, // @@ -35,14 +36,16 @@ impl GspHal for Gh100 { fn boot<'a>( &self, _gsp: &'a Gsp, - _dev: &'a device::Device, + dev: &'a device::Device, _bar: &'a Bar0, - _chipset: Chipset, + chipset: Chipset, _fb_layout: &FbLayout, _wpr_meta: &Coherent, _gsp_falcon: &'a Falcon, _sec2_falcon: &'a Falcon, ) -> Result> { + let _fsp_falcon =3D Falcon::::new(dev, chipset)?; + Err(ENOTSUPP) } } --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010071.outbound.protection.outlook.com [52.101.85.71]) (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 A0A653451CF; Sat, 30 May 2026 03:10:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.71 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110631; cv=fail; b=NXtjqmOJKizdVIR/BH7Ria1B3sQWdTwMQpfXRupx0K/2hWspdhtzjMyi2NjM2NgSdKcc3eD8I1lRInJ9XjwVZ6wq+W+K7T/wvNQyXT2PZNidflFA13CSnRXxqcbtsTNlbhQtkeFK1c+HmcrDDLVoNOKnznt7/5aQYb++DBXlHPM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110631; c=relaxed/simple; bh=3LpJGQo8GR2Ljf9awG/86+L4AiqjesRwZ8v5UXa/oqM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=DOEaYLVtaoVDQ3JucTYfTd1bBYYRsOLQcdo8ghVRi/+RMd84uq5hLrpytKQ6fcFpbuzb5kmpokchpWfwnBL+yt96E2+OhmoqAtRRqNCWs2O9HJ3LW7PPXfo4nd+Cv2m2IFwyeAbAAXYHnD0Dq7JHS9AjB2BRu2nT6yESFYsKIKU= 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=EBFSNbEm; arc=fail smtp.client-ip=52.101.85.71 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="EBFSNbEm" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=aLvSKj0vLNQUO0dywbVigqNWCoDIGKme4Q+lZoy1/BSG/caycKMGpnjGrBB3xZurfkSVwtoR85vpJbrNQ3u6nhHMKtfIRVNVg/v66kUDQShJkU8ke0bkc/FpS9tn5TF27H2kNThZmV0rxvDSYyAodYgewUeXWE9WsTXep1ACIIi2NSixSl8kfxpLujo9jWNqdRXkRnrw/J2SraejnWxcBZw+ml/6DJYz3HIffZD4JCy2GZVsu7wK04KRd4SgaxxrO361Exu6VwOZ14GCoonRbstoyjZ3eYmAlkVNjBMJZUykH4Y6K5koCm4wMHKrpXkD0NgF7HIJDtVO0zyoPOAgLQ== 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=ph3vg6nbl8q4a3nns5+4SQUy8KMrzn+gbKOeJqCjgjo=; b=HgbE0bYEXDf9IpWcajwQMmFeHitLCmDR70vtouVQOluIXxGTZroQE4XHAYseclpP/7oAze/ry+kQNyraOf6it0MeXFfKYdU30BNF0h6G38GNLEVkvDaxpD5qsR3Q+9s12JSVK8Lhqa6dhkMLQD4gCauj4V4wAyEIBwAv9KRk/N0/73dEdqh8+LbUHx/1NZQ1+DBXMXDaCmebei30LhEVbxKQP9my9lfV0drqw+1cwiFUSjf4l1FwS6Ocwm/DeqROx11IAIK7HZRmHK8aRJY2LlCGhfeAfzoukVhZv2AX50OQ+CDn1sLio4ObKKASJdGH81xySZ8hMwDnVr0mbHQDvQ== 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=ph3vg6nbl8q4a3nns5+4SQUy8KMrzn+gbKOeJqCjgjo=; b=EBFSNbEmya75z/7Z+TWkdz8RV/iS8Rnygt0TmLYMInPiK5BAfcgTDjDmcRtf07sOzbXmrdLfXlZHUr3tr/oco04PcIDxEx5RjgUB/gQ4kB0rkQMYGEDRTr53C/T71HFqPHfvVUmEP9RIdgMF4Be7RwrBUCrudVsys4O4u+LwvWrZbW8WfQGaDfCugSaquM2tCXu9qTkidSfDoS+MYScQ8A/z35DVe4noOB2mV/J6BsWJ3FQPwmd9K58Rks9ODf+Zkome6KKVyb6YbMwJkecWkucRAybStg7Uejio8DoTCeKY+IkOsIUPS+WuMK/j80IhxX1wLDwYflx3ky6Tl3CFqw== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:09 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:09 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 11/22] gpu: nova-core: Hopper/Blackwell: add FMC firmware image Date: Fri, 29 May 2026 20:09:42 -0700 Message-ID: <20260530030953.740561-12-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY1P220CA0049.NAMP220.PROD.OUTLOOK.COM (2603:10b6:a03:59e::15) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: 4b2f2cc3-6252-4dd0-e558-08debdf8f4c2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: gilAF9Mx5ZXo+r4ZQRMIDOZ3dG4aW08ik3yiA+4HgpT4Wq/aFU3f2BzX2kmMpRh7XlzgcmwUBPvPXzRKodzVYlT6kPq4CBvDY/blXPkuWT4OzruXAWsK39SX+LdQIDnq9fkm0NfhuDLyRU4Kuavw0ueRP2Dt2qk15LpDqjQITxZlUzmC6x5gKTcuX7Fj0mC/cy5TcTj2VOoyO8HHtiQh0zz9EVEY1MuCEaRZ9qeJLNkhbW7MgDJvMflbwo7Lqmi8UdsgWqTOLSSNrQIGkpeINmdICMdGvP13YeSYV+xsFXYMoxjgCH5qckHdGZG6Z/QqQXLFBNGL3wzrQUv33hvH1n9jJym+O6ltUdkVFHQ3sYVjpbiH1YsrpQODQnwZXXS5tJ3Mq/+wySiMyJ+oVXw35/pKF7ZWO001AUoptgwoN7jTODJzw89P0cliukvLaFWdJzmbJji6uuqx3Om+GvmdhBAcjGCbQcngjbuoCI00qPo9jFcjQFAZWR5t3gqizDNg5SXgR8WZR4K4Vzg7gegMOWporFoRTL9Fu1xfAwebZ0b9cORsVQu9OZNww0JPyZjDZx3feVUJHtS6ifMjjPvdNN6KSG6tndK+cNQJfYGKQ1loP9HAH7BRBHISWbt/ncLOcDjo7jIG2rqiquVAulRUgvI3lSN7gl8DJDMJ2d2H5txgYzrm0ryUZGVWt2pPATOi 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)(366016)(376014)(7416014)(1800799024)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?2YMEqpOUM+zl79dEYjuMYTVGUewU8hc2pNriqrOwM69mW6oMZ0M4adcgJPhK?= =?us-ascii?Q?hy3pkYIhWxMoDq03jyguecIpDAZA8n5F0T49TYPLd+9NDfVH/1KIqZ6+SKSA?= =?us-ascii?Q?lwxOcZriE1rfbQoiabPnp7bsfdLuxXiub3eRillneUKP+LDEEdS4qXuSFbUR?= =?us-ascii?Q?VPsTSEzdFNmDp36Q9iGrtDGkvSQP0UCZaOkIRLSkOnVj3kRN9Aq2lFvLK+KI?= =?us-ascii?Q?uld4sVpXgS/fKFVSUN4G7HUajO3N5nTcRV8K1a2x5rtvQxo1WyCQJAbns//B?= =?us-ascii?Q?BRfWmmPDtVX99aJcXpy+y8UFMuNtIYpInjm97Q+MmTgZ6xaSTtfJsO8vtp3O?= =?us-ascii?Q?7CECqpZVXGU3vuwSKpZAxoPFRU/k2vo3aeiTfRVE++MoPYA0EySt4fdAofpj?= =?us-ascii?Q?zakPfieJBxCoYnt1HAGdFrsD+97YPf0XER9gnyPbjmuNn9hHg8jQ77eeIGhb?= =?us-ascii?Q?Rk404WhU/ka4G5yJF6HoJ/0RNKk01j4/c+KBacsOUF0k4YkysNKSAjJLVgw2?= =?us-ascii?Q?7fSv90OC4KWDAAO0IqUm2ARXnzS9aXl43fdNEzHoNWbPEIwsuFjt3cCF0dJT?= =?us-ascii?Q?uqKwLuX4vvpcyWfCEv0sAufpSEXk2oxPGH4IsRqEnHCRJ2ugwQZidDWAfBBW?= =?us-ascii?Q?F/9aS20yJd+kIa30QlqoIhQws7ZNNyCTei2RrvAbJRALc7sKojh+y/pisHZz?= =?us-ascii?Q?gzfod5oxlpofoigxOhK9H9V0VWinhNL9g5+xVcYzQyR6Pw0hkvH64S/lNBq0?= =?us-ascii?Q?G1p2tCCgWYEy/X1uOh2R2CQ785FR/LqwKp5q1icIkXJFPwm303pTSR5z3hir?= =?us-ascii?Q?vfn3/4Ehj+e1fvhrNiEdAzxnQ6SJmGevkZPQBGL2AvTjuo2yNdtxuBVydLHO?= =?us-ascii?Q?rJ7KIbB51MkgYjdW24DcGe6XWECOCibZaJkGbXiCW445auMS+4RJk2Lv1iYR?= =?us-ascii?Q?ZGBYwMYzVzST/JmtOln3end5eelVJcLQXT4K2zzXS0OVC+wvAFWIh2ehGSLL?= =?us-ascii?Q?/ly9eDyfKm47FGeHdX+bu0pdl7eFc2Bsw/nH9qqTeMWUT/LQgiZbU9Mul8Dq?= =?us-ascii?Q?BZF1kEsKOhdK3Aa9kj/EEjhRBz+X8w58WMbCDPsY3fougrX8LbsAOwGlf6qb?= =?us-ascii?Q?3CDsNLMMNRcbSEqfIOGcVJC3UCiEVbUIb+HPVAjH9o1fnO6oz7tTuw/fIoCf?= =?us-ascii?Q?acq7alFt5vDJnzOEuYx90ZZzx0OLuZAb53hY+X1xHB68QjvHj+0F8rDAlk/o?= =?us-ascii?Q?97zk9BL3+yqqxkFG10KDcmnRFXED2fnE5ViweDrDkbEncmB4ZFOUjVMwFTKb?= =?us-ascii?Q?a1FGZgzUcVuRJ/NSYSVlW3RNMC7ODBMiTa65IRJrlNWcskgY02PItTRxVX/q?= =?us-ascii?Q?ZYlgrQ8ulkumy8gIiC7FmPZvoflUf59F6DrFtDWlW9U6jFRYMXcC1j1zIF5y?= =?us-ascii?Q?dHze7WEL17t+Y4PTzp3d9yalb9BQ3sqOCpQGxARIXfa8gxz6J90oJQNt7Jlo?= =?us-ascii?Q?CV6uW00hL7O/r95HPInGJR+KPqT86lubqIWDpCNAnjf/gxafZmijUC9CtCOT?= =?us-ascii?Q?yVxX8YrO5BPcAUwN00IpJINK3vXPvWP1Ruwj9oEivJM6vM5sJOHH8Yy/2rsA?= =?us-ascii?Q?QBnR9ZF/6oYVzYF7DKcqemdJlS7NKihUZjjYUSC/baFBMGEz7Pw3NXZcH36/?= =?us-ascii?Q?m+U2x21ljayP1D+IksHcfdQehX/rcGj6KRnud2Tv9fmY4oC8AaBqm7vsXVUx?= =?us-ascii?Q?PHSAh4+VbA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4b2f2cc3-6252-4dd0-e558-08debdf8f4c2 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:09.0561 (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: 2y4CrM1fd2RtohRikpEyrTQPB34sJneCYat0CdsHrG1IfJC2T6sS2MzVtCaeG9BbOh8lx80ZbjIehpKrrz01qg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" FSP is the Falcon that runs FMC firmware on Hopper and Blackwell. Load the FMC ELF in two forms: the image section that FSP boots from, and the full Firmware object for later signature extraction during Chain of Trust verification. Co-developed-by: Alexandre Courbot Signed-off-by: Alexandre Courbot Signed-off-by: John Hubbard --- drivers/gpu/nova-core/firmware.rs | 1 + drivers/gpu/nova-core/firmware/fsp.rs | 47 ++++++++++++++++++++++++++ drivers/gpu/nova-core/gsp/hal/gh100.rs | 5 +++ 3 files changed, 53 insertions(+) create mode 100644 drivers/gpu/nova-core/firmware/fsp.rs diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index 866bc9b3571e..6edb50b83a29 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -28,6 +28,7 @@ }; =20 pub(crate) mod booter; +pub(crate) mod fsp; pub(crate) mod fwsec; pub(crate) mod gsp; pub(crate) mod riscv; diff --git a/drivers/gpu/nova-core/firmware/fsp.rs b/drivers/gpu/nova-core/= firmware/fsp.rs new file mode 100644 index 000000000000..011be1e571c2 --- /dev/null +++ b/drivers/gpu/nova-core/firmware/fsp.rs @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! FSP is a hardware unit that runs FMC firmware. + +use kernel::{ + device, + dma::Coherent, + firmware::Firmware, + prelude::*, // +}; + +use crate::{ + firmware::elf, + gpu::Chipset, // +}; + +pub(crate) struct FspFirmware { + /// FMC firmware image data (only the "image" ELF section). + #[expect(dead_code)] + pub(crate) fmc_image: Coherent<[u8]>, + /// Full FMC ELF for signature extraction. + #[expect(dead_code)] + pub(crate) fmc_elf: Firmware, +} + +impl FspFirmware { + pub(crate) fn new( + dev: &device::Device, + chipset: Chipset, + ver: &str, + ) -> Result { + let fw =3D super::request_firmware(dev, chipset, "fmc", ver)?; + + // FSP expects only the "image" section, not the entire ELF file. + let fmc_image_data =3D elf::elf_section(fw.data(), "image").ok_or_= else(|| { + dev_err!(dev, "FMC ELF file missing 'image' section\n"); + EINVAL + })?; + let fmc_image =3D Coherent::from_slice(dev, fmc_image_data, GFP_KE= RNEL)?; + + Ok(Self { + fmc_image, + fmc_elf: fw, + }) + } +} diff --git a/drivers/gpu/nova-core/gsp/hal/gh100.rs b/drivers/gpu/nova-core= /gsp/hal/gh100.rs index fe2689764c8d..c38d88bc42b0 100644 --- a/drivers/gpu/nova-core/gsp/hal/gh100.rs +++ b/drivers/gpu/nova-core/gsp/hal/gh100.rs @@ -17,6 +17,10 @@ Falcon, // }, fb::FbLayout, + firmware::{ + fsp::FspFirmware, + FIRMWARE_VERSION, // + }, gpu::Chipset, gsp::{ boot::BootUnloadGuard, @@ -45,6 +49,7 @@ fn boot<'a>( _sec2_falcon: &'a Falcon, ) -> Result> { let _fsp_falcon =3D Falcon::::new(dev, chipset)?; + let _fsp_fw =3D FspFirmware::new(dev, chipset, FIRMWARE_VERSION)?; =20 Err(ENOTSUPP) } --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 1491F346773; Sat, 30 May 2026 03:10:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110635; cv=fail; b=IzLJA/muYQjliinZrAjX5Fn/KQ4gU0S1nfAuoxzoQNWkFvKflGQY0387v9TeMQTFIeCh6aSzDchiM2506BqqNz4XL67BtHcXoY6GKSt6MFGnJZRtTMHoML76Bq8azN4s3Siuehycwe44UOxmSzp159EEQyxSf9qM4+5OuGxEB6w= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110635; c=relaxed/simple; bh=uvAuUBcUJepgeFg5k7GPCpz0Ad2TEJWhJPtGR6gHUHg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=HCX9QCnQX2w4mQanHz8ca95JQ/7H9fg9bM3/LCe8eM6HZ7Rn3p+zc2gNID7JxBapG3kWkGHKdqr0w6mtPZxOlHl+PpaPKJCWtIv++Ouit92IUnP7oRgcmFVddoYY1rEkqQZV28anLJjqTKZrUjw0LpVBMPt8cA4xtJUBpBooKFo= 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=kJ7V9uGY; arc=fail smtp.client-ip=40.93.201.22 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="kJ7V9uGY" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=M0DuArOMgCaqzkMzdZSRkzROaJlpx3+HoP5CRod78JVRkl9s30nhWNWMAN/Yn3bBNkzTfWv4b0BHGaXIzJhMtmk3ocWRjoSM5RlZjU2iXexDEwwpKZkWIadwMIGAZSWTRqEG5LVkFs+MzuUlWtUWocuhGU3GJ97hpjFkybL39XEJGQQd14oOoYHtJ3GWTHVVw6PPW/W1uERFpcV0ViAv3GvRUt67Th61HV8lojvlWsua0N/xEcuUCrsR8JQpfoQA7mUdz+ml1MtulTsXTxyD3VH02F8R5cJDbWu8jaEVc1HRXcA4HlkzDa3GwwwwrZxoAwG1lZvZupZLJA6dpejk9w== 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=3VZzN3xwvR5TffLMSswnZdLk3NLG+zo9t/b3z+N7NZA=; b=TpGi1rO1/ySCMhSn56EHAWTHbAZs1sGqLrcazEEph4Asxo2okuKhWqdMv0dt2gqxYwHwmjlPvcXEqo26oQ77ejbzv4cfLFH/zEYyv/oPOEBZWpm98/aXBLiecQ8STtWD9VRfx84zHvBS06xfeE8A+56FOnY0Uq8CtOM51lWKmyuMtxnqKUuFmpDC32tLpu7JIawGeCptDxXinBb2fASIbNWZFXubqODscrXi74A6soXG+ET9oc2lY5HgrKEZ1dDj12+/NfIQu3URECv3rm6fNkb3khKv0fBubkYqT44fGTwIHien7TMi7PoXCT616etllQ1w1S1w9WGugG6FZ6udZQ== 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=3VZzN3xwvR5TffLMSswnZdLk3NLG+zo9t/b3z+N7NZA=; b=kJ7V9uGYfa8BJRHOZ7RSo92c43zeI34ttJFC5dVnH/s1xhvp1TkpSA+dwuZORJV2vt2mhLPGlEa5S4s2alkjDAYBBql7hw7QLBOA6V9lbjcOQCwXy47H82S5kD81RHgKPV2i8Y0QidXvQtxX1Y8T/vgL/3Nn1njDSJLDs7OSzeAMRk6eVaumj2hffOJLPNSZ9FeotaaAfg9g+ynVLb0250VGsUYvsEHdwpPTsjX6JT7nCGPt1pF+uDa8g77joig75RgM/rmiskqubo7p5P0a1P5x6zzwFiGhfcD7NAvme772fOpm4ZwMzlkbJxkhfJ2Xk09Ef3XLT/ypK/QqN1a3Fg== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:10 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:10 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 12/22] gpu: nova-core: Hopper/Blackwell: add FSP secure boot completion waiting Date: Fri, 29 May 2026 20:09:43 -0700 Message-ID: <20260530030953.740561-13-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0123.namprd03.prod.outlook.com (2603:10b6:a03:33c::8) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: c32f2e22-a1c3-4639-6059-08debdf8f56c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: jq4ILQoubkgnjJKTyhR4fAEMn3YKprlnqNZNu9HQKMtFNT3/tMs1PnWycwqJR+34aNHWU8tyusK0YkhdgyHEk8ylqt3YuHODaAXD/8vf11kGD+Jw6Hnx0u+elySEoQpPt5D4c+xPOt7/yIyCHQqsN4gp1BkRJBrJcq4TazSvfofH4566QKGM5wHY4hQ+YcMGP4rKG1T1tnIH0is+O+IO3zH5+SLXx9l6zyPZ9QNtgEf28XPWSujCevEtUQ/jb7+NvravQaKm43RPCjgmsJY1E52EX5RmX4Cy1mRzRv0MRHwdfZs6KVlVKAT0OOBWPC9liXBr1xbW1hzqMarwHJ99BFDv2IwlA1BzoOzJrS8bHmzv7roTGwaizyvqAB8p8c9VpF+fDERgRqqrLGCiXs4iQGhImBWmhBk/D+0tBLRUWAJf2MzVP1US1tHvTK3cRZaN9bvBAZSsyLWf5B9igxZdeO/VoP3sahsZlZD7J++F2fCSGuJG/EI5C11ZGxLpX0zt/WLlI3hxcIzhS89IlnZRbdLyGI1fRHbJe4p6POHYGs1xmpkwd41WzEuSFb36nx5Pgj3PvtzrnBUPbSXOca0tl7uUCW7GRh1J0uI+24dVSX6wMIjBXakdL0K72P5W+XfOQ2Ab+Diuz4JYZGrt7ZKth1cy/WABRtbVP2QHbEmELRwaDbhIbRv2/8L/Ue4nwbfB 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)(366016)(376014)(7416014)(1800799024)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?xc3QCEnEwiO541SMRavWMjj5/xqqn0WA1IEQQpwNQ34HrqYu71afv2O7EFJe?= =?us-ascii?Q?DsD6h4qJRzPlWb8yR3drPCj5je00BPs9gyHb816edU6/xLEpBLFn6yZP4WqC?= =?us-ascii?Q?5TQEF2d2PSwpM+0dbZlUEBnP0UfzRbIOEyjEpQvlUHTFM1XmhOG/Os/pyBGU?= =?us-ascii?Q?1S9Ss+fX1ErSpODfHIH2/BgYfRH4ccdyxqSs65+yEcGAfYMgDoiNLWMtosf/?= =?us-ascii?Q?8BiQzQQm8Qr2ijFBzDZ+S++JDkj50BTAje+nFR7IRigwOi3tIUMoHXQ+69E8?= =?us-ascii?Q?m1V/g3dFnusEpK2w0Wp/TVqYhTr5dhCB6pp2vfvkQGQhTjrjNZWLTS3UsVth?= =?us-ascii?Q?9jtcBHYl9wQ4cNngO/vAkmejnUdBeXxhOcIpV6n6wcJGm92TCofgGqKIeMK9?= =?us-ascii?Q?mQuohB7BOk5JxK2AGpGbNAlOzfJ9nLOvulZCywXpb8DSwLdQfOlbaz3hj/uE?= =?us-ascii?Q?lJBypB4ADrkQhZeU19AddW8Vbt+68cCZrgKctSKyrM+b9Qv8uVnadKIgloVF?= =?us-ascii?Q?0e9UECvhjM1hTK0KbSw+mWiwBYDtb35qIJ+QeEfIPddVwPiAE9lMA1mFFG/a?= =?us-ascii?Q?KwuYZe28I8X9jxiw3uH3J6zXn/Cyqt8Cqrr88b8jfZqeOVVE1Ado6GZklZgN?= =?us-ascii?Q?1cEWaF8OEtFrmClaLgN0FynqyzKX5aVwAy04HxA2EWnjDm86rbnaMBmIh9Mj?= =?us-ascii?Q?SNyevmjP41TPwrlm914ouyLq4gBcIYGTcsDyIXt3JSrs5TbuUhYnFlXC5Yd+?= =?us-ascii?Q?Vylw6fuBkYwqKMd2eF2Rbsfbms4BxbZ0ahB7gDlh4J1hadbCtcuROXskfMCE?= =?us-ascii?Q?QKIzZJ8Eai/Bm2Eev9YsqLHt/wCXxEbRQ1InFvxKf1xB6IhQdpePiWdHcpWb?= =?us-ascii?Q?30m4J6oEe251ya+59OF6OnQCZq2t+VWpLjC1y14ZsNX1qmKFjDFsDUYURis7?= =?us-ascii?Q?m3UPiIKbBYPC5RsAznmvGXZsWELVBlcM/odmbgczlrEn8l9+XkFrx3/juYq9?= =?us-ascii?Q?WqRghdXTMeFRjJ29qChM87j8gISnLh5DZYXOnWK2ecKdnbYro0DUynjKBQ7c?= =?us-ascii?Q?/Jn0HL81H2lYDxuqDDKFBZCCud7+/j6fR3pV00D0qGk7lKITU3lwnLyvPxam?= =?us-ascii?Q?CXpjVHwYrUl0XFF4cTUVCdhxWwE+8esXzSHDEW3n9JpVRJapNnwUW8Su6clq?= =?us-ascii?Q?BVylO46Y2PWiM1eSJauix2J+MLTTVGj62/YD/qIc0FkrAI1tUMws6wnvFJ/3?= =?us-ascii?Q?LpkcTTwr+EhXaCdeihikzQ0tP3vlMkwzSu3cO2yDNVDiXlbNybC0bUbFY8wr?= =?us-ascii?Q?YFlcgKNzQXymJbM3P0pH2+BMm/tmn45Z+4VbMbM0+Kr1tQz9B/OOpkEhlDrc?= =?us-ascii?Q?QsEuLg+9qK7OoTEzyd/IMRKkd7jJL4lBP1OiAF1+ILQgGK/3kwC4lmeqLVGc?= =?us-ascii?Q?3FwGe1yuLD+oIWpk3aQ68XWrysHbZBkyTPBuOPSsjXW3OZ5hkxLHkicCNBWz?= =?us-ascii?Q?tslOnpfUL2n7tXpaeTbHR47ONEjhBTpgXsdxfw8cljU3h/PbCRlxlDdJyKid?= =?us-ascii?Q?5UBOpoyIek7dRXIWsc+MMPjUmH5HeTS5ZT9xybpB8XAWNdN3PSVD56x7I9b4?= =?us-ascii?Q?6Ic7am2EevGZI5S0Q87nrOelY3MHP5B0Jgq+QKRBdOmnqJsbHnPH4NhH9H4p?= =?us-ascii?Q?oS1WybADFQEByLiRlCcjTKlksLOB1YP9nThZRz4pACaKTzqz8xgvouRateWh?= =?us-ascii?Q?bEBaDSY+Fg=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: c32f2e22-a1c3-4639-6059-08debdf8f56c X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:10.3227 (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: 3jlrv+kzI3LSJZRhKJzl9PGN6uPXP7rUAdg/5gyO3G6Feyok0NheQkN1/sTU41qTk/1bM6gq818NvtI+g3oNxQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" Hopper and Blackwell use FSP instead of SEC2 for secure boot. The driver must wait for FSP secure boot to complete before continuing with GSP bring-up. Poll for boot success with a 5-second timeout. Co-developed-by: Alexandre Courbot Signed-off-by: Alexandre Courbot Signed-off-by: John Hubbard --- drivers/gpu/nova-core/fsp.rs | 51 ++++++++++++++++++++++++++ drivers/gpu/nova-core/fsp/hal.rs | 27 ++++++++++++++ drivers/gpu/nova-core/fsp/hal/gb202.rs | 23 ++++++++++++ drivers/gpu/nova-core/fsp/hal/gh100.rs | 23 ++++++++++++ drivers/gpu/nova-core/gsp/hal/gh100.rs | 5 ++- drivers/gpu/nova-core/nova_core.rs | 1 + drivers/gpu/nova-core/regs.rs | 36 ++++++++++++++++++ 7 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/nova-core/fsp.rs create mode 100644 drivers/gpu/nova-core/fsp/hal.rs create mode 100644 drivers/gpu/nova-core/fsp/hal/gb202.rs create mode 100644 drivers/gpu/nova-core/fsp/hal/gh100.rs diff --git a/drivers/gpu/nova-core/fsp.rs b/drivers/gpu/nova-core/fsp.rs new file mode 100644 index 000000000000..ee8fc384fe38 --- /dev/null +++ b/drivers/gpu/nova-core/fsp.rs @@ -0,0 +1,51 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! FSP (Firmware System Processor) interface for Hopper/Blackwell GPUs. +//! +//! Hopper/Blackwell use a simplified firmware boot sequence: FMC, then FS= P, then GSP. +//! Unlike Turing/Ampere/Ada, there is no SEC2 (Security Engine 2) usage. +//! FSP handles secure boot directly using FMC firmware and Chain of Trust. + +use kernel::{ + device, + io::poll::read_poll_timeout, + prelude::*, + time::Delta, // +}; + +use crate::{ + driver::Bar0, + gpu::Chipset, + regs, // +}; + +mod hal; + +/// FSP interface for Hopper/Blackwell GPUs. +pub(crate) struct Fsp; + +impl Fsp { + /// Wait for FSP secure boot completion. + /// + /// Polls the thermal scratch register until FSP signals boot completi= on + /// or timeout occurs. + pub(crate) fn wait_secure_boot(dev: &device::Device, bar: &Bar0, chips= et: Chipset) -> Result { + /// FSP secure boot completion timeout in milliseconds. + const FSP_SECURE_BOOT_TIMEOUT_MS: i64 =3D 5000; + + let hal =3D hal::fsp_hal(chipset).ok_or(ENOTSUPP)?; + + read_poll_timeout( + || Ok(hal.fsp_boot_status(bar)), + |&status| status =3D=3D regs::NV_THERM_I2CS_SCRATCH_FSP_BOOT_C= OMPLETE_STATUS_SUCCESS, + Delta::from_millis(10), + Delta::from_millis(FSP_SECURE_BOOT_TIMEOUT_MS), + ) + .map_err(|_| { + dev_err!(dev, "FSP secure boot completion timeout\n"); + ETIMEDOUT + }) + .map(|_| ()) + } +} diff --git a/drivers/gpu/nova-core/fsp/hal.rs b/drivers/gpu/nova-core/fsp/h= al.rs new file mode 100644 index 000000000000..83d1e7daa998 --- /dev/null +++ b/drivers/gpu/nova-core/fsp/hal.rs @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +use crate::{ + driver::Bar0, + gpu::{ + Architecture, + Chipset, // + }, +}; + +mod gb202; +mod gh100; + +pub(super) trait FspHal { + /// Returns the secure boot status from the architecture-specific `NV_= THERM_I2CS_SCRATCH` register. + fn fsp_boot_status(&self, bar: &Bar0) -> u32; +} + +/// Returns the FSP HAL, or `None` if the architecture doesn't support FSP. +pub(crate) fn fsp_hal(chipset: Chipset) -> Option<&'static dyn FspHal> { + match chipset.arch() { + Architecture::Turing | Architecture::Ampere | Architecture::Ada = =3D> None, + Architecture::Hopper | Architecture::BlackwellGB10x =3D> Some(gh10= 0::GH100_HAL), + Architecture::BlackwellGB20x =3D> Some(gb202::GB202_HAL), + } +} diff --git a/drivers/gpu/nova-core/fsp/hal/gb202.rs b/drivers/gpu/nova-core= /fsp/hal/gb202.rs new file mode 100644 index 000000000000..2f08b6c9f308 --- /dev/null +++ b/drivers/gpu/nova-core/fsp/hal/gb202.rs @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +use kernel::io::Io; + +use crate::{ + driver::Bar0, + fsp::hal::FspHal, + regs, // +}; + +struct Gb202; + +impl FspHal for Gb202 { + fn fsp_boot_status(&self, bar: &Bar0) -> u32 { + bar.read(regs::gb202::NV_THERM_I2CS_SCRATCH_FSP_BOOT_COMPLETE) + .fsp_boot_complete() + .into() + } +} + +const GB202: Gb202 =3D Gb202; +pub(super) const GB202_HAL: &dyn FspHal =3D &GB202; diff --git a/drivers/gpu/nova-core/fsp/hal/gh100.rs b/drivers/gpu/nova-core= /fsp/hal/gh100.rs new file mode 100644 index 000000000000..290fb55a81da --- /dev/null +++ b/drivers/gpu/nova-core/fsp/hal/gh100.rs @@ -0,0 +1,23 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +use kernel::io::Io; + +use crate::{ + driver::Bar0, + fsp::hal::FspHal, + regs, // +}; + +struct Gh100; + +impl FspHal for Gh100 { + fn fsp_boot_status(&self, bar: &Bar0) -> u32 { + bar.read(regs::gh100::NV_THERM_I2CS_SCRATCH_FSP_BOOT_COMPLETE) + .fsp_boot_complete() + .into() + } +} + +const GH100: Gh100 =3D Gh100; +pub(super) const GH100_HAL: &dyn FspHal =3D &GH100; diff --git a/drivers/gpu/nova-core/gsp/hal/gh100.rs b/drivers/gpu/nova-core= /gsp/hal/gh100.rs index c38d88bc42b0..151df05e303b 100644 --- a/drivers/gpu/nova-core/gsp/hal/gh100.rs +++ b/drivers/gpu/nova-core/gsp/hal/gh100.rs @@ -21,6 +21,7 @@ fsp::FspFirmware, FIRMWARE_VERSION, // }, + fsp::Fsp, gpu::Chipset, gsp::{ boot::BootUnloadGuard, @@ -41,7 +42,7 @@ fn boot<'a>( &self, _gsp: &'a Gsp, dev: &'a device::Device, - _bar: &'a Bar0, + bar: &'a Bar0, chipset: Chipset, _fb_layout: &FbLayout, _wpr_meta: &Coherent, @@ -51,6 +52,8 @@ fn boot<'a>( let _fsp_falcon =3D Falcon::::new(dev, chipset)?; let _fsp_fw =3D FspFirmware::new(dev, chipset, FIRMWARE_VERSION)?; =20 + Fsp::wait_secure_boot(dev, bar, chipset)?; + Err(ENOTSUPP) } } diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nov= a_core.rs index 5a260062295f..7b6c331da10e 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -17,6 +17,7 @@ mod falcon; mod fb; mod firmware; +mod fsp; mod gpu; mod gsp; #[macro_use] diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 65be6ec71ed4..270779d31ab3 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -579,3 +579,39 @@ pub(crate) mod ga100 { } } } + +pub(crate) const NV_THERM_I2CS_SCRATCH_FSP_BOOT_COMPLETE_STATUS_SUCCESS: u= 32 =3D 0xff; + +pub(crate) mod gh100 { + use kernel::io::register; + + // PTHERM + + register! { + pub(crate) NV_THERM_I2CS_SCRATCH(u32) @ 0x000200bc { + 31:0 data; + } + + // Alias to `NV_THERM_I2CS_SCRATCH` when used to check for FSP boo= t completion. + pub(crate) NV_THERM_I2CS_SCRATCH_FSP_BOOT_COMPLETE(u32) =3D> NV_TH= ERM_I2CS_SCRATCH { + 31:0 fsp_boot_complete; + } + } +} + +pub(crate) mod gb202 { + use kernel::io::register; + + // PTHERM + + register! { + pub(crate) NV_THERM_I2CS_SCRATCH(u32) @ 0x00ad00bc { + 31:0 data; + } + + // Alias to `NV_THERM_I2CS_SCRATCH` when used to check for FSP boo= t completion. + pub(crate) NV_THERM_I2CS_SCRATCH_FSP_BOOT_COMPLETE(u32) =3D> NV_TH= ERM_I2CS_SCRATCH { + 31:0 fsp_boot_complete; + } + } +} --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010071.outbound.protection.outlook.com [52.101.85.71]) (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 3AD95344DBD; Sat, 30 May 2026 03:10:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.71 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110635; cv=fail; b=Ox0RAqMnTAhORE/OLUe+A5jBKhCDZU9GRGDBal0UknepCpfKBW3AmhbsGu6fM9YMf8mDd85zsTg1RCncnl4vYS0uAultPi/offeamToz908vIVuOLLhJxjqbCHEbP+Vr+YpCw0XTSraum3CILKm17NyIwc8N5+5fLb/HmTPBazc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110635; c=relaxed/simple; bh=obUqXuBkLMcCBJtc0TlhHn4r2pd34x1Ks005zozYI9c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=fqOFpYfxmtxYK5gXNnYNcmslAqckNLIVl5LT5lQ0w3UQYdFxIWeG8+WwVIpQBHj+PCfUK3OkmK8VdT3KFKy8+f+mg1rE231pBdDb7m1r0MxgEeNrruzvkzbgypI/tJXG+tUY5S8H6At1Yd6mk7w0dwmXMouM6qz4z5/C5aHccFg= 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=OXv7LBqQ; arc=fail smtp.client-ip=52.101.85.71 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="OXv7LBqQ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=SInfbzIMojIFLcDvp7tarEZY/8T3KIDfkjwOSkqQ4idzdEJ43w2ncK/g2JeFhbbUoshJBfJgF0AB3mPe/DHjkIN/NB4C7BnxTG/9+tLvHfTDpsq+qff+fz2v6qUf+8JGgMIecomphVzKJKbqHptRtCM4s5Wky55n6oaBSShHqldWGDmleGu0An6xXQsWCFlAlFq3z3u6LOonbix9HgNxHUZSAH0xFyAsrgatQ2MDDISabjSv6QZc6d/LBMWYI9ZZ5yq/3sKa/g5HSnJqTP4FxvpXwQ/MIMErdT36t500l8dabTR5wddL8XjLPFGFKxdCbCgCYyJ7wl3llVyAUY7Deg== 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=RDb3eMWkD7eeUhLtv9iO3i9r7gtf7aYcHOcyCbjzy74=; b=mw/9rwtXDHAeP4T4uJcnQUQL1Ju2UvqfBX5TIf2XtkCej9hUO6ajAV2BTFGLBMypiFRNaXnPyhtfjNrlEvVLOxFXUm4Lr02y0ffsdB/j0i0D+EqAQ9lqim9dGHXLkIx5L8EMeK+oSsVOV1QLt5BRXen9Do7db9QtkhpIwZvfHH542uDVSw13yfeeKRHsPO2/SsLGK+OWklFzLael8KSOPz7Q0M2j5UduiohVUWSZis+Ush7L94H3VvrmVw67NmseY51WnyVLxNkeFH7wC0P6RdLEZrwYZfCo6z17QdKci3O9y7cLdDvGjY+4o2bTdVUMJWQ8aaw9xz4BG6UbtWf6Pw== 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=RDb3eMWkD7eeUhLtv9iO3i9r7gtf7aYcHOcyCbjzy74=; b=OXv7LBqQ19z5kpAgWCkGkj+DQKast3Yfze6WtHxOsOGKG8aLlRNIrUk39SHPfbEEGAjaw1U/vhy9hWCrNKLm6hnR0PWFfdnX1hiTcOB9caWAAwpr0CJ8rukdVAaFPbGLakYL5x6HXGstl14ocYfjlDbn+NvugD1vgLKTSKNryHYKwV25Ueg8eguIRIQkXZAuk9gxTkW2V3x5cPx2TO2Hc2dQJ7OJOm+mF9ES3YZb+j3H8n/XQxVMAezuS7Av+dz+AfZR+51mudWcG9L0vIhTnQ6LZFcnmnm495KXW7DZEPAcYCNdNr94SRKZbUSUQupM28Dn/ZrWV12loZ+NWzFLzw== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:12 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:11 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 13/22] gpu: nova-core: Hopper/Blackwell: add FMC signature extraction Date: Fri, 29 May 2026 20:09:44 -0700 Message-ID: <20260530030953.740561-14-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0126.namprd03.prod.outlook.com (2603:10b6:a03:33c::11) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: cb0c32ea-5489-4efe-b23c-08debdf8f624 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|3023799007|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: MuPMuWKLYLxtVc5BN0UWcKBDaD+OuaRZ7WXr5Yt5U0tSvjzm2CTNbXXRKwA1CDQ0k335CfKvHacinWW+IYt2tbe6s7ncfl0fzWOcJgPtzCDE6pzCo7/FISNB5HyDTh70nDyrcqiWtvBNu9H3JdFuP3xMAAgUmwOF+OX+UZ0H/AGGZLD6i4Blci1+gc9tghWK+hZjZODsNF3sWDOGeHKPC40AD5F8EnNsWIWHn2UGzi/GuCnaZjVGPqq+BnDsiI9w39NaWNEEM6g1YVIoQbzcbVkzsq7NJ21VaBOxA0r5cZTYjPS1YAKXEy7HU0WAHBrk7r1hDe85gtzmWfLjCDCckT4ZH3BYYuQfMdx2aHV0g1EjDKeZeFpCvXjB0P3yHTZm9wNM1jvJoOjHZ7gIUpS58Cee5sDBCDn/meZk0qOglFRvOxRusDW+NQHEkF8OF43oFxXEqNLjCHZLn4yvpSgHxiu+PhyhvV3OwnQnsDSaXT7Yq90gD8bxKgELjOaI68+alwYgtwWE5lozHUf0UXvHD+zU/PsEfglk31iFoZdpwAkFXXwgndY6SqXx3sq/sm9QKVB9RaOziHwiTKC6Tk+wF5f5ixgMuX/9NOkaoiTaKLzZFpbSV3zSpgtzzlPooYf+/FqPxT6irUYiRXXAvJIdZF6TZINZiucD/vISTV7w4RmkhgL8AZNcuLQK0Co0w/bG 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)(366016)(376014)(7416014)(1800799024)(3023799007)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?4+0N57XPydoPSZFSgQCBcRRScf+FHiy987AIDknkzOZzsjC4chtGQ/RlZCpN?= =?us-ascii?Q?x0k5/ZiUWM+CQoqI4nRr8nZFadH78kshsyT+7+YuHGBmn0oeOw/6HbDYn1nd?= =?us-ascii?Q?Wrf9oyU3sXrqPO+vNBT3mnxx4/V8nBNdOG6mf15co9UYIOVlZEUfijMuDHSi?= =?us-ascii?Q?BXab5xBKS8qjNF/tzvwrnZtVE6p5fLTd1hR2GUQqSiEcgv4VRsBa7e1JMtZE?= =?us-ascii?Q?MT9zRNFwYfx616Dl/KEpGxpSsOR4iC5cwM/26XGGkNTR1cZdBze6mVAeu7S3?= =?us-ascii?Q?mLvTKgY6Vy3Yg3MOC816TaYQWQp8ywdXBBD4YkLAeQ86lWF9q6KnUlvikiaH?= =?us-ascii?Q?LUNDHajrPLjtbjj1z5MwSVrqb1CaTfDecRvXMv1oCeryu5Wn4ajt+Oc7BXLA?= =?us-ascii?Q?0E2KPaW88qlE4VYyXKLQ1V1a9HDbJObJHTUWzqZBPyBH7B+6oJDWiu/0NLtG?= =?us-ascii?Q?mw03gWIJ9j3VCAkzjsGm+clVKPsU1oodwTQSEYh1MGXDV3/u/m+e/h8rrifq?= =?us-ascii?Q?I0k7urtO9fVCd2ZvZUJbJ6jftD/WCZ8osNuxyf4xVDQ0CaUJLMaCdPL3K+vX?= =?us-ascii?Q?4t5b2gZ24HCoc/yY2kyEr5W5/40BaCm5eL7BZHC/0cKiKwTwUcLCmCU8WP7L?= =?us-ascii?Q?LS7duw4+4QfsIEfcSU9TkKuPlkhjKlQmK3dygCaRctP8QgU9w9Nq9iptZUrk?= =?us-ascii?Q?yZPCwN6cAdkxPQ+ExoDwKDv0UrksAMaudGPjRuVEjKSzxc/PkCp8Z5+MkI/5?= =?us-ascii?Q?szuQAarmUBN0F1EJ3+uRSGwrX8vSF9UX4Gzma/ZffhoiYecN5uxGe9Z705xV?= =?us-ascii?Q?kPHaXuyrKoULt8EFM1t0XuiueVMReg+fDa5uriRxZo8RDktboXT42KoW0P2d?= =?us-ascii?Q?AWkgPONVLPhqwoHjgIyXN/iupXg1xTIrDxL6zIKKoYrGv5PZNkNNUcQSdduN?= =?us-ascii?Q?11gIba8A/7zn6WJb7AIOx6NMT+Eq28bIzCBAE49tW4ZMne7W/vWXo5KOd9SH?= =?us-ascii?Q?Vf3g9wuFtOFv8bLKlmQmqsnigaMJ40y2UOqE+sy1YQp97KWrNNNgP5LMst47?= =?us-ascii?Q?VGvNSvOo+CoKUZJpx/pGztKP4ABZRJabILa0aKmKunbtc8KlQU5xnCKWMwWL?= =?us-ascii?Q?39xfFVZcalv85g5BPwyXsU7tZ4GCqpvfrqrk4L16lR68ULOjDEKfECj36KGa?= =?us-ascii?Q?b9zt+4DQ4J+PE7p4Kr4LwehdnmE8pKI+CldFCsZ+qQV/4anyFXaI357QCtQa?= =?us-ascii?Q?V5LJferVl5CkTke16cGdugoepsUMF8M7x0cBa5raZRjW94U/HpGfyNu8bbCw?= =?us-ascii?Q?7DclYIMT0sa7JCoNRiwkx5qv/1Lh56Nj9EFwZq9Fw+N0VzBpZkWm3sQ+Mwqc?= =?us-ascii?Q?5M0P59+Ww4lrkF4BapcovN+AaCh39CsrOgOBkcEOyQs9Eu1ZIx8fbX+x2qvQ?= =?us-ascii?Q?/0VRF6qtJXa5m/Es7kzWbqm4lDsilILPUxME9qWuPPRvFWT5sUhLMR3mh3Zi?= =?us-ascii?Q?SpFA8lMvs/onyqxMKLcTHrGyvrFOtzM2ykVXHphAh4OX4w07f9GxQBFaIdRI?= =?us-ascii?Q?VegKPkxFwLv0syFNG82x2m4afhNAo3TAD7OYTEFLp0evs+GaRmXDa0pWu/dn?= =?us-ascii?Q?03yxbf87+SjntuJCDC02PI165JhZq5LT57URb4BtEhkbN9WHdh27XDTpKf5w?= =?us-ascii?Q?D63vUAASmBY4/hG9t+Az9F+YrJ21XEAGbcjvj46vBJ6zzmQ7Ov/fBt/fEYHl?= =?us-ascii?Q?vvF7hS/R/g=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: cb0c32ea-5489-4efe-b23c-08debdf8f624 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:11.3702 (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: x/uEFeMUw06RsU5kZnuuHWFe3n3p4jmMKGZUQaYyrLvE9jDAjYGbVbpCYZBcjJKDTlS66B1/T6QP/bMhzuXycw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" Extract the SHA-384 hash, RSA public key, and RSA signature from the FMC ELF32 firmware sections. FSP Chain of Trust verification needs these to validate the FMC image during boot. Co-developed-by: Alexandre Courbot Signed-off-by: Alexandre Courbot Signed-off-by: John Hubbard --- drivers/gpu/nova-core/firmware.rs | 2 +- drivers/gpu/nova-core/firmware/fsp.rs | 90 ++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index 6edb50b83a29..569efee0d4ac 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -641,7 +641,7 @@ fn elf32_section<'a>(elf: &'a [u8], name: &str) -> Opti= on<&'a [u8]> { } =20 /// Automatically detects ELF32 vs ELF64 based on the ELF header. - pub(super) fn elf_section<'a>(elf: &'a [u8], name: &str) -> Option<&'a= [u8]> { + pub(crate) fn elf_section<'a>(elf: &'a [u8], name: &str) -> Option<&'a= [u8]> { // Check ELF magic. if elf.len() < 5 || elf.get(0..4)? !=3D b"\x7fELF" { return None; diff --git a/drivers/gpu/nova-core/firmware/fsp.rs b/drivers/gpu/nova-core/= firmware/fsp.rs index 011be1e571c2..dc28d0cc2d03 100644 --- a/drivers/gpu/nova-core/firmware/fsp.rs +++ b/drivers/gpu/nova-core/firmware/fsp.rs @@ -15,13 +15,35 @@ gpu::Chipset, // }; =20 +/// Size of the FSP SHA-384 hash, in bytes. +pub(crate) const FSP_HASH_SIZE: usize =3D 48; +/// Maximum size of the FSP public key (RSA-3072), in bytes. +/// +/// The FMC ELF `publickey` section may be shorter, so the remaining bytes= are zero-padded. +pub(crate) const FSP_PKEY_SIZE: usize =3D 384; +/// Maximum size of the FSP signature (RSA-3072), in bytes. +/// +/// The FMC ELF `signature` section may be shorter, so the remaining bytes= are zero-padded. +pub(crate) const FSP_SIG_SIZE: usize =3D 384; + +/// Structure to hold FMC signatures. +/// +/// C representation is used because this type is used for communication w= ith the FSP. +#[derive(Debug, Clone, Copy)] +#[repr(C)] +pub(crate) struct FmcSignatures { + pub(crate) hash384: [u8; FSP_HASH_SIZE], + pub(crate) public_key: [u8; FSP_PKEY_SIZE], + pub(crate) signature: [u8; FSP_SIG_SIZE], +} + pub(crate) struct FspFirmware { /// FMC firmware image data (only the "image" ELF section). #[expect(dead_code)] pub(crate) fmc_image: Coherent<[u8]>, - /// Full FMC ELF for signature extraction. + /// FMC firmware signatures. #[expect(dead_code)] - pub(crate) fmc_elf: Firmware, + pub(crate) fmc_sigs: KBox, } =20 impl FspFirmware { @@ -41,7 +63,69 @@ pub(crate) fn new( =20 Ok(Self { fmc_image, - fmc_elf: fw, + fmc_sigs: Self::extract_fmc_signatures(&fw, dev)?, }) } + + /// Extract FMC firmware signatures for Chain of Trust verification. + /// + /// Extracts real cryptographic signatures from FMC ELF32 firmware sec= tions. + /// Returns signatures in a heap-allocated structure to prevent stack = overflow. + fn extract_fmc_signatures( + fmc_fw: &Firmware, + dev: &device::Device, + ) -> Result> { + let get_section =3D |name: &str, max_len: usize| { + elf::elf_section(fmc_fw.data(), name) + .ok_or(EINVAL) + .inspect_err(|_| dev_err!(dev, "FMC firmware missing '{}' = section\n", name)) + .and_then(|section| { + if section.len() > max_len { + dev_err!( + dev, + "FMC {} section size {} > maximum {}\n", + name, + section.len(), + max_len + ); + Err(EINVAL) + } else { + Ok(section) + } + }) + }; + + let hash_section =3D get_section("hash", FSP_HASH_SIZE)?; + let pkey_section =3D get_section("publickey", FSP_PKEY_SIZE)?; + let sig_section =3D get_section("signature", FSP_SIG_SIZE)?; + + // The hash section is a SHA-384 output: it must be exactly FSP_HA= SH_SIZE bytes. + if hash_section.len() !=3D FSP_HASH_SIZE { + dev_err!( + dev, + "FMC hash section size {} !=3D expected {}\n", + hash_section.len(), + FSP_HASH_SIZE + ); + return Err(EINVAL); + } + + let mut signatures =3D KBox::new( + FmcSignatures { + hash384: [0; _], + public_key: [0; _], + signature: [0; _], + }, + GFP_KERNEL, + )?; + + // PANIC: src and dst lengths are both FSP_HASH_SIZE (verified abo= ve). + signatures.hash384.copy_from_slice(hash_section); + // PANIC: dst is sliced to src.len(); src.len() <=3D FSP_PKEY_SIZE= per `get_section`. + signatures.public_key[..pkey_section.len()].copy_from_slice(pkey_s= ection); + // PANIC: dst is sliced to src.len(); src.len() <=3D FSP_SIG_SIZE = per `get_section`. + signatures.signature[..sig_section.len()].copy_from_slice(sig_sect= ion); + + Ok(signatures) + } } --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010071.outbound.protection.outlook.com [52.101.85.71]) (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 4C28D34A797; Sat, 30 May 2026 03:10:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.71 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110640; cv=fail; b=PAX/HwOrHb2H/mmOLLNtHhwDwllC6zhDDd7wcs7fR0oGhw/M3D0MMjWeCwKxN1kQkz+bdmIMIiSJY9wzY8e7rPcC8xrHUXx0KV/h3r/X72MdYRiUDb/vSmEWlGDlpoBmfShL5tHVS8aJjGG+2WniUx2mjuyzNeUs4tnkiODqfgU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110640; c=relaxed/simple; bh=f1UBiKHzbYj0XIH8CFz2yWzF+A9xoXlHkEPbhDH4BOM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=OPkUrbUJKTqD9uO01EdUg1MdRofph3PRDsiet/DctlCg5DYcKImvw45AmTnZGbtjBjtBN8NugioccCmZMK0+YK3RooeopsLfqUzOOKTwtewGonWSGW3+Zm1HQ5HSeQbJt4mSW+FhzKM26iHWt9eN64uZkXN7fWjjaok6i4ehOes= 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=oCiPZ21f; arc=fail smtp.client-ip=52.101.85.71 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="oCiPZ21f" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nxJyOpMtxsJoL29T+jwPX7+D5nr54tg7/HuiqcrL0KASfmg1ScDkBy+Mz1km+Lv3cLkLOSF5kbpD7rxLiRJo9xBnQs7uR6iQCEQiVpTkQYPcco4pi6rNmoPtvKqL68fsif9zT65rVhPwAHMIMWQLBdo3XdmXMVXN1K055/T/UIKeYrmKv653jaPMKpKJAQ7JB5Te6qNS78Z6fdniXyGxJOjSk2LGSRgqzjA5aYAPeJHW0+0R2odMFoyjur30hTYD+IfnCR7nlbSxz/xZuOHCSpT1AeP7WJpyi8kIG+pIfrmns2BdKEbJHZPJvdsqoG/TB7U55MVJznVgpgSg5RBLbQ== 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=lWSuwU5O4dxY0xF2Z1/XeHogvuuSCzhX5C136J+CeZY=; b=SFu2NlFIUYGyczxHgzBuivET1kEhOthvpj4tjl0nlsNuwzY4CjpS6nSaxOfIiyfFpNLX3lrOkNlSm+UGKvmFOjbfGmXjQPr7/96RqWWGdg3OVHP57NZU37hTaV3yr0zGFsxaixXRJqa0qtiXcwZkXkJsTgrmJylbRUOpaZZi35zroVksxZGr5ji6v5HFNIk/ETQdGWIVEmpxh4YVuSJZbspPn/k1Z1mgI8wb4PznjO6JVi0y1VIf3FUftBwa2WqIag/8vsjRSag5uEgQD6uOmxz2ZHGO1YQGmmnqcVka+dNCANk7yDwil874geS035t5/duudmhJMagEkB5v1aORAA== 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=lWSuwU5O4dxY0xF2Z1/XeHogvuuSCzhX5C136J+CeZY=; b=oCiPZ21f6Z8ScpHenZEcqz1pGFYarsOQz9qzw83akU6Rkhs4IBeXqY2samE0+7ThRnOHUSkZgra1cA7zcyCX8ch/2Plt9vs80Ra/g6csPmwRjnE400Oby95aF39diGs0NEGBla6rUjr8C0tPmhcn9m/e8de50hSaA4dQuYiriWSy23PeZABuHjmXOKb4P5kfVHGAnX+WYKvJUaQ2x7E+6LR5KneYBRk/zsGgr6sWFSSp5diKYqkOG6fELymtfuHVZttLa5Lnd08k1+kcq0vREJzKuZ1RuA3bpCAMAZapRXdufA+UnDW8fvYKY4I8R1r3Hr8FkbjFa2eIjm44WH7txQ== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:14 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:12 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 14/22] gpu: nova-core: Hopper/Blackwell: add FSP falcon EMEM operations Date: Fri, 29 May 2026 20:09:45 -0700 Message-ID: <20260530030953.740561-15-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY3PR04CA0016.namprd04.prod.outlook.com (2603:10b6:a03:217::21) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: a7469d9d-de81-45ca-776c-08debdf8f6cd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: tDqmRjYiR9lyqJ7LIpYLatmenl9U5GtuTE70+pIQjtvlKtDD1CRSW2KrMyQbuXeWj0oQRKsenCxajVqPl/tBxrhJpTiHUxvDqQ1JXiS+JClUlmyNaM8LvaTr1ogVY/IGnKT7bbYRz0qIbjpAZMhHkb5k/rmdTrOJqyY650+rX1NLGyG5YIvt8QTVKbLCbdn8xOqqRCG0JTyC178nMMCOPXJFz8N19Nity5wqykwxr1Xmzy4z+ZH19yoaF+hwaQw78zWJViwuzv68phyJFWQVNrDZ1nDPDe7M/MoWMSOi6VVldauVGHAcQv9dmj6dndt4fmhAzwvBzpMfTGpq3U7DJB+C8l1ZJJIxhrNJ0lyRqb6MHKkFKgT17ujXs5jqPdNAn+yXdyJQfGUAvYwzdOvo76vurJU34aw7Oh9uH6uMBCkJxmi5npg4LEU+KAsQ07lEi7swOmgMOmblZ7cYjoA8PQuQ30c2rYtCbcPlMYlxocEGNQd5jRYMWf3UV81QTSDyXfDvgX+qjvR+IuHxV8ocRqaC/CbmVe4Olj8R8rel961/URbVNVWGFjEwYXwPtqwnphGLYF0wRV1VxhYvLPzjQ4NBbu6FGX0FW64f2DlpDD988WIxD6CYXydQP/reHdejCNxOszIBl+p5GMNclJ8I0CiTg7XeNwuJQt6/otO6VMKH8Ezv3+2chT4hzRxLEfi1 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)(366016)(376014)(7416014)(1800799024)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?Wk51EjinwLBBz4dRmcqOZdW36Y92lSa+Ydyerqmf+48vIvLrj1+eQ6feeNUk?= =?us-ascii?Q?fK5nvnWyfIgyRTbO6LC3woU5eIewmn90YnL+qZw+QzliBMLmCdczcpsbHoVj?= =?us-ascii?Q?0/kCAsQ6Zc2KN3xbyReSjtplJRAkH3TsU3i4RYCqBBUvwU8r78phVMO6eKF+?= =?us-ascii?Q?SBm1tJJADBUj+LMgJkOlVq9q4AERUQsA9c3Kmm2AOlVJMB4Zy/eyoAd/+lWj?= =?us-ascii?Q?pCMFhDa2muFvBKaZut+uw8kqjXiqHIGGRiDSv9KPRVJYDIqQewWSsRimX7w+?= =?us-ascii?Q?OoGUe0tDMFBYZDAY5T4WsBoz7v/SPE890ZWrgtm8k6rSXxemNeewzuc2UhxQ?= =?us-ascii?Q?gomezfJP+l/XWEeLYOo1mewFktd0FfnzJwZKMCnBooGnxN8G4AHVdBnZjCuT?= =?us-ascii?Q?/DSMqPmKO86EPv3GGXkVMIbBqyWKZUmDdaNr5AHv/z3R6RoDmSrCfU+0JUW4?= =?us-ascii?Q?BlRGCQ/NepPP0L6vAxFrsli1lXY/nIH0RZV88CSLWock/CIVVx3iG/8F6FQS?= =?us-ascii?Q?BIMO/uQaiX5Velygx8+MytqDc2ryoFnNQJ9OId9MEp0oszVAmSthZHNEkIf/?= =?us-ascii?Q?512O6O5dxB+PXL13wQEuZKS+VpbPviPDQvH3a1kkVDj/KN+d8gu8leVLEA4i?= =?us-ascii?Q?KOt0f+lqvd1fI+E/0G8Ck/btxPS/U93PEZYBVqmH4jCOd9rJUGxg+7E54JHy?= =?us-ascii?Q?KrlTKkZemnJYYhBDcGKyW052o17lWiOIsKG6GF3MWisdaLPwOHxfPKCTEQF/?= =?us-ascii?Q?3p/C9SQP5Sc6rhxRcmvCcTomMVdVmKUahnAU0ZH8/GZA5MU/OjTi03QJHcM2?= =?us-ascii?Q?pvBUINZXUXM0Sg6egfFGApolK3U99T6Hhxp4FF2DP2ribBDJF8UdOXdV80nA?= =?us-ascii?Q?i2oQlSDa6HC/3aaH2mHpcAOEXq4w3C8u1fOvMfWjdBMDiIwp9cxtPKPU3Qx1?= =?us-ascii?Q?/hPz5H4qTSR09qDfXNv1YgYu/QitXqBA+nONJNY7rXXlhledt0NtLAmVgFzc?= =?us-ascii?Q?j90t3lbFf5mhjTxyZTpeFsToVS5tqZ72z9Ebm5e7CFPExVKankuyhYaQ5ofO?= =?us-ascii?Q?qhmOvP/gbQ7LZrjtRPNdxasmj2gsfOWzyErK9O4waXSPe0UTbrR/qScxP6Cx?= =?us-ascii?Q?91W6kS8j9WpuhNFlqwst+3icJaUIbZyex6OC5U4uPUXhaO2KJiyFjDhNV2oP?= =?us-ascii?Q?F5l/JM0bRPIsZ1j9uFOlXfZqnXSMljboIaLCYxZBoSx3bIlpr10vK9nJxmHJ?= =?us-ascii?Q?XRsKk99ZYTlAIeps1sW3u/0ggS1p66/GqaNfLGiG1ocFjVxT/OuzjRp13APO?= =?us-ascii?Q?vsTnX4rTo+gvH6fpi9+Ebi5dm56J1CmEgJb8pCdSsl2QZQnsy8K069HT1Q38?= =?us-ascii?Q?vn851u1cqwa4ZEdHON2qtwK319AtGRgRdM6M/6lKbo5e89mMIdu2Sl0oXUBG?= =?us-ascii?Q?HehOhWTEKhagxUA4a7VFDaVFElp0ibZp7Iuqu8bLeNchg9dEu4Zua2FhE4pg?= =?us-ascii?Q?+ph/w6JQMZTVQda5197c63vxmMeNWt4E9DBf5S/Ya/zSGHSXQamE7oFwvcj1?= =?us-ascii?Q?3uN6rp/DMS6NvslSZTjtqEQJyyU5W2U9lRw+qTf+9vnFdof7AD6eVx3Od1/N?= =?us-ascii?Q?AOHuDz6ZQflUi6aDdzLvFBtKHob54Fsk1Dytm6dtk9wBEG3mCj5OPrhT+7nW?= =?us-ascii?Q?y1kpg6g0ZF/xPDdZpFYssXYJOLtZ6Pkh301zINYYCpqs2NX84SBzl9ta8lQC?= =?us-ascii?Q?bKAK0AWAFQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: a7469d9d-de81-45ca-776c-08debdf8f6cd X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:12.4718 (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: xfc4A+hMbVpbV3U/mVIxspe1cqxJsc+1sdkfAXJn/ptOq9CfU02KuUZV5MzOGJ0+fszgoCmzUyQROuw/tqKvxA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" Add external memory (EMEM) read/write operations to the GPU's FSP falcon engine. These operations use Falcon PIO (Programmed I/O) to communicate with the FSP through indirect memory access. Signed-off-by: John Hubbard --- drivers/gpu/nova-core/falcon/fsp.rs | 130 ++++++++++++++++++++++++++-- drivers/gpu/nova-core/regs.rs | 15 ++++ 2 files changed, 140 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/nova-core/falcon/fsp.rs b/drivers/gpu/nova-core/fa= lcon/fsp.rs index 73fb73cb73a5..7067c1963745 100644 --- a/drivers/gpu/nova-core/falcon/fsp.rs +++ b/drivers/gpu/nova-core/falcon/fsp.rs @@ -6,12 +6,28 @@ //! The FSP falcon handles secure boot and Chain of Trust operations //! on Hopper and Blackwell architectures, replacing SEC2's role. =20 -use kernel::io::register::RegisterBase; +use kernel::{ + io::{ + register::{ + RegisterBase, + WithBase, // + }, + Io, // + }, + num::Bounded, + prelude::*, + ptr::Alignment, // +}; =20 -use crate::falcon::{ - FalconEngine, - PFalcon2Base, - PFalconBase, // +use crate::{ + driver::Bar0, + falcon::{ + Falcon, + FalconEngine, + PFalcon2Base, + PFalconBase, // + }, + regs, }; =20 /// Type specifying the `Fsp` falcon engine. Cannot be instantiated. @@ -26,3 +42,107 @@ impl RegisterBase for Fsp { } =20 impl FalconEngine for Fsp {} + +/// Maximum addressable EMEM size, derived from the 24-bit offset field +/// in `NV_PFALCON_FALCON_EMEM_CTL`. +const EMEM_MAX_SIZE: Alignment =3D Alignment::new::<{ 1 << 24 }>(); + +/// I/O backend for the FSP falcon's external memory (EMEM). +/// +/// `EMEM_CTL` is programmed once with a start offset and an auto-increment +/// mode, then each access to `EMEM_DATA` advances the offset by one 32-bit +/// word in hardware. +struct Emem<'a> { + bar: &'a Bar0, +} + +impl<'a> Emem<'a> { + fn new(bar: &'a Bar0) -> Self { + Self { bar } + } + + /// Programs `EMEM_CTL` with the start byte `offset` and the `ctl` mod= e bits. + /// + /// Returns `EINVAL` if `offset` is outside the addressable EMEM windo= w. + fn program(&mut self, offset: usize, ctl: regs::NV_PFALCON_FALCON_EMEM= _CTL) -> Result { + let offset =3D Bounded::::try_new= (offset) + .map(Bounded::cast::) + .ok_or(EINVAL)?; + + self.bar + .write(WithBase::of::(), ctl.with_offset(offset)); + + Ok(()) + } + + /// Begins a write burst at byte `offset`, auto-incrementing on each w= rite. + fn begin_write(&mut self, offset: usize) -> Result { + self.program( + offset, + regs::NV_PFALCON_FALCON_EMEM_CTL::zeroed().with_auto_increment= _write(true), + ) + } + + /// Begins a read burst at byte `offset`, auto-incrementing on each re= ad. + fn begin_read(&mut self, offset: usize) -> Result { + self.program( + offset, + regs::NV_PFALCON_FALCON_EMEM_CTL::zeroed().with_auto_increment= _read(true), + ) + } + + /// Writes the next 32-bit `value`; hardware advances the offset. + fn write_next(&mut self, value: u32) { + self.bar.write( + WithBase::of::(), + regs::NV_PFALCON_FALCON_EMEM_DATA::zeroed().with_data(value), + ); + } + + /// Reads the next 32-bit word; hardware advances the offset. + fn read_next(&mut self) -> u32 { + self.bar + .read(regs::NV_PFALCON_FALCON_EMEM_DATA::of::()) + .data() + } +} + +impl Falcon { + /// Writes `data` to FSP external memory at byte `offset`. + /// + /// `data` is interpreted as little-endian 32-bit words. Returns `EINV= AL` + /// if `offset` or the `data` length is not 4-byte aligned. + #[expect(dead_code)] + fn write_emem(&mut self, bar: &Bar0, offset: u32, data: &[u8]) -> Resu= lt { + if offset % 4 !=3D 0 || data.len() % 4 !=3D 0 { + return Err(EINVAL); + } + + let mut emem =3D Emem::new(bar); + emem.begin_write(offset as usize)?; + for chunk in data.chunks_exact(4) { + emem.write_next(u32::from_le_bytes([chunk[0], chunk[1], chunk[= 2], chunk[3]])); + } + + Ok(()) + } + + /// Reads FSP external memory at byte `offset` into `data`. + /// + /// `data` is stored as little-endian 32-bit words. Returns `EINVAL` if + /// `offset` or the `data` length is not 4-byte aligned. + #[expect(dead_code)] + fn read_emem(&mut self, bar: &Bar0, offset: u32, data: &mut [u8]) -> R= esult { + if offset % 4 !=3D 0 || data.len() % 4 !=3D 0 { + return Err(EINVAL); + } + + let mut emem =3D Emem::new(bar); + emem.begin_read(offset as usize)?; + for chunk in data.chunks_exact_mut(4) { + chunk.copy_from_slice(&emem.read_next().to_le_bytes()); + } + + Ok(()) + } +} diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 270779d31ab3..5871bbce7052 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -467,6 +467,21 @@ pub(crate) fn vga_workspace_addr(self) -> Option { pub(crate) NV_PFALCON_FBIF_CTL(u32) @ PFalconBase + 0x00000624 { 7:7 allow_phys_no_ctx =3D> bool; } + + // Falcon EMEM PIO registers (used by FSP on Hopper/Blackwell). + // These provide the falcon external memory communication interface. + pub(crate) NV_PFALCON_FALCON_EMEM_CTL(u32) @ PFalconBase + 0x00000ac0 { + /// EMEM byte offset (must be 4-byte aligned). + 23:0 offset; + /// Auto-increment the offset after each write. + 24:24 auto_increment_write =3D> bool; + /// Auto-increment the offset after each read. + 25:25 auto_increment_read =3D> bool; + } + + pub(crate) NV_PFALCON_FALCON_EMEM_DATA(u32) @ PFalconBase + 0x00000ac4= { + 31:0 data =3D> u32; + } } =20 impl NV_PFALCON_FALCON_DMACTL { --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010071.outbound.protection.outlook.com [52.101.85.71]) (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 99A3433689F; Sat, 30 May 2026 03:10:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.71 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110638; cv=fail; b=thTCO110iXGH703ktaChF1SzjbJcCPJf+DVT89HwvKcy7rBeOIB8Y/2UNOATefov+5/v/OsvljQMhXTYoG+zTsq/4sucDRBmLgDPqKJ5U+RfmAoKCmSx0D7txFdVbrHpEh6xnaEBQZhJYZorxTPMRGLLvhDERtBaZ5yWlPyo9FA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110638; c=relaxed/simple; bh=29iYyHfInC3eoTWQwK7iliRaIO7Xkz4c1qYfoMK9cUA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=iLmZI2P+/ncOqZ6DAj1pLMOyeqJ4RRZzpwezXqTSK38DCOTgS6dTJgPdwHf9czlttNNanp4NJIatJpoE7vmWSwE2e7dFFIOvMVDSVG5lR211GD8FuffzQkEZA5X1R53j1CwNBwWbBD9KBiQ2q96IvyLM2tGZMQ4Z1GLt0Pb5wHU= 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=awb8cps3; arc=fail smtp.client-ip=52.101.85.71 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="awb8cps3" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bSkZAOMHZNgz2V2K5JOMLk8LFgq03fxdQYWkkaMGJnu8hF+qwjMH6wUR0NaXKvlBo5VUFeK6URzTtlmHAX9cjMDJzf2xhCNtJBCG4jlgPB9C1iqMnEta/DzE1MrGdFeRabdw4dipMCbdy/N/jvjgeCMr5/iNlPx7FHzly4EjOpH4HC+Z0Wl7ntsxojcJ70SuGm+Inen3Cup6/7ulaz2HRntHsvlV4OVjEFdmY8Vz8++GwhdbwZgTkIXGdiWnMf20Icb/W3Bw4EXSOJU3d9HtG/pzIxM+a8VdQ/Tth7mh0GwKbi+XzdfY/b3PWmY7I8cRsYGoI4ayr5Pf7XRyjLntiA== 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=UggvjqSG5v+1De6KKtEtxC1q99mYrtLclcTXAcMypVE=; b=RfPNN7Oe7Mt/d/8K3xs7LC19sBEQzl1iD49p108o7mnesrBNHPUXkU5ZsOVGcKuvaPx6x6Qqob1+YWXNv1drH0dVqS4dhTDT7mT+/Bu/5nggR1/vxz8iW3Re9EmVhMERqKChlUgs8aTgoqtIUIMtR94DA9vlpthmFZXYaVzlm2vbGQXnuTv8mWmTUiIshiNx0yzdZ0+aNayHEYk/THmrsvTlbPq6l9e/9vA1LDhaOIipg5jQA+U6VvSqqs9+Tg1bywj/8i4OsaB/gqKD8WpF/FrZ19yLT0tfXYVj9h69NSpiSNuX0b/2aIYmfh73TCG7Qr4V1b2T5JdeViYjhw6wYg== 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=UggvjqSG5v+1De6KKtEtxC1q99mYrtLclcTXAcMypVE=; b=awb8cps3QWKaNNcczrkTq05iFHxHQcKyinQ8f3Udf1txrtGwnAwhEeZBR8Mk9FnVhpAvVLfelZGY0I8+heQTUTDSGQu/zlNkKsHNv5YSkOQadxfyDB36zjJnyL7rLVeTzoRLOstcua9wFqCHQWDsHvKYxQ8J6MGBgUoTSjqr7d9M7cy6qVK1aL0jvbTETqLtJQ5QegZVcCVFIri4+/yvvhS8kbODUTA7/MDxy7iz3bS/JL7LvUgyJ62B/E+ToPDb/bqRYdKAfXucU9R+kPpfuhPlmjmmQdWR7bi7tL6TmfDiXpo1ye+TnMU4jAfQEs5i2UJOMwpNEJZmldMVfAnW/g== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:14 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:14 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 15/22] gpu: nova-core: Hopper/Blackwell: add FSP message infrastructure Date: Fri, 29 May 2026 20:09:46 -0700 Message-ID: <20260530030953.740561-16-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY3PR04CA0013.namprd04.prod.outlook.com (2603:10b6:a03:217::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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: 6fdb854b-4328-4739-2f70-08debdf8f788 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: zQiy1ihaWWj8pIizyqTy8w/l+EzVXKePpsznAOfmhvtL0LgFmQhZ5y2vVzXCjRQ5Cx88ObXHxupa8UFyTPavcPCORlCquBpf4oyhF2qCAKip9YisuX60o1Zo5a6oezpd4629taN/hhJTl1oEeZcN2uOVgfanWV/9T7lRzrym3e+LlodOayAgF1tyrFaIM5YGM76wTYt7xzIUpIhjU5m6ZnVu9hkgHLOxgTf8hIRLZl7t4Xc2NN6UUFroj8dbJls777oF4VW88KebsOgRkjbFDEZFRiqwfXvy8gU9w8Bka6RhKPxQvIkOncMYywV2n23y1TKe5tvXzQsgWsZt3k1yT4vy/P2k+JRsV2CprZBsQ4bURkuvmNkbjxTLxhQRIkN2FykVggiitYME0ZNUErsD8bphwnihku8qWNdRBQyBzunCRdO745HHXzFU6TTnU4rbSStLv2GfORa3HYmZcsO4wdUnlT3n51NqohAmSO4sVTX2qsdNKwyidoguexXgvEZ4ZzsgwZ12wVqVQzAdl7pAULZDmZ5TzDpjUWh4r27fiR1j1nRIuZzcLOEYu0mIqeaGwX2huP/zMO2oWE0WHU9caZN2OTcxzTfyVZu5wok3XuOGLWVGQ7ier2OMMno2V2j+irOaJ53o6r2dJoBpKElHP12pdKyWmr7t9iCbXoPa/8EvBZwXFv+m0PQHR8zTC0qH 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)(366016)(376014)(7416014)(1800799024)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?CfT6J/1YZ9Nv4Rp6uHZ8/EDBoFjlIa5V0q+t7zHjU2JwS/e6e/nU6RXLdfyd?= =?us-ascii?Q?gZXErw6MhKYJHiSvL2eOu9UI6AEKi+hu8ijKvwMp3JEsvid2sVepg7YcXa6w?= =?us-ascii?Q?AjRs3J4DcRQWHW5ixwF8C3H5oXLl9kTbbZsimg/1R+lUENEfif7aXmO3OzDr?= =?us-ascii?Q?rdWr3q96rXPwGBfgygsPON390QRrPl7IRyN1PlhTtYZkZvkvnvBRkDc7ZWJh?= =?us-ascii?Q?duGd+SNToP6o0Qhev0ZbfcmboP8LsLOu+/ruJ/GfHmNddoN0H8RxB40a4vUE?= =?us-ascii?Q?xRp8/k/18qnnmY/Xne4Vd4sVIZfVv4mvd/wDvyOx7dzxx0JY+3Jur8U+nqRL?= =?us-ascii?Q?ACV9Q9D31Pb8LdP2o4ehhdmnVvRCOgGSGdMC4FRXEuZw9VyALfxTLzach7Bb?= =?us-ascii?Q?H6BA/S6Vx6b7Ntj/dw5QqPNXJ+ojoITouAp9O8H+DnR4u2Kl3ZaM+yWtJEdD?= =?us-ascii?Q?TOGMI6wikze6N3rgoe4Al2/Yx0Ix19jaj6dLnkQaHa/c9LdCer10UsAzdvIs?= =?us-ascii?Q?82+a1AIYIH/OwAYO/0MLyC5lz/ELziZrTfdaCjzOWq57rkSdDrgeL8h0ZUQG?= =?us-ascii?Q?hYo3+PpbxvWqFo65q1PHYbL30cZfN/DAAZZ0BB7RkbiiN+4aXyoyt8qCpLv0?= =?us-ascii?Q?yqYvYRiEI4HlCxoJ32Ol0g4XIPA4zNgwVRhPcG7NJbiWlaLE4jI7jRFRfKtb?= =?us-ascii?Q?Cga9t3duCnGEjO/rXCaw7/VnsehEaOGwkWs0boQ3VKkk+ShmzFt3Nm74POQy?= =?us-ascii?Q?6btGuSrlbiA7ef5TxHTb9+rMXu1rBQn75pgnZ6EK9viVX02D8gXVajYW8Fij?= =?us-ascii?Q?8BhrqX0JLP/7urKPtZ+vgCGMFThi4VQNaE6ndASOSeWcNo3scBNYbKROK3CK?= =?us-ascii?Q?9cYl/p+xSqb8EMx8nXD9H1iaeeb/5UctQ+tybAWq0ijiGmsEq8W9a2xqv45s?= =?us-ascii?Q?0jpwk6TwZE2kmmoU+in0fvq5LHbXEMOKp+IIy/laJ8yj5pEzTAQVE4hfD6gu?= =?us-ascii?Q?YnKHcjuDAR7Vic/2uab9nGiMEVr3upBvYSdJMDdsIqo5+ssc6tqt7iUdx0fD?= =?us-ascii?Q?Zh7l+dDAPmBHTLRAX43d+aUwpfUotQm3buCemJDgO4gw4JTgqNnXqIxT3xTc?= =?us-ascii?Q?hYhK/Vqs+FQIxsU/PJTFA9CSSKhaW8f+W64/cGvZQVTODby1sBRproy/PfLw?= =?us-ascii?Q?d6fQbgs/QBMXWG1MOJOzkmxygMWE2SazRlWRzGy9uIHdXuKvOn7Qyibb7w4U?= =?us-ascii?Q?qU1dc66xLeLDF5Fj2C79gCd/yrVD2sjkSCMCZ1SIgdm2ozk+rYirhSfUidQV?= =?us-ascii?Q?F7SPF+aVQlKVl+T2iM0TNx03/ccEq2YNlfcF3FssH+qEyh1WFmxDDjxURsVw?= =?us-ascii?Q?RV1dVqo2oDdCtS3CnIrUD9IkXiDSbd/nRoItw2oSkiqRNjqelYgla3BMhI3l?= =?us-ascii?Q?hogElQBhaG9LNRCG3k6yrEttIODq52VNUSCn0P+HWkjaBmzh5v07v0jFHvVj?= =?us-ascii?Q?+Fb82tp99tPUSVR0z0RpSx+09PuRK/hNZZLuLiETA1pHpOu8tGXGwpKILIY4?= =?us-ascii?Q?xXp6B3dry6llEca9k/inH9bqYE1eIT9+7GbbH6HdZoWxNsJtyRk9sFBXAtvH?= =?us-ascii?Q?3aIniJv0SO1oTgbTPbZkn1Vlwy6oQuhQL+NGPJW8iPRRqEC2UC7s4BkS9ZEY?= =?us-ascii?Q?BJXoLEPxehORuGS0hlSXs/gDAsxGz710M2lLWzm7i3R+HOKtHp30JfmWbBGZ?= =?us-ascii?Q?Y8ucYOJZBw=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6fdb854b-4328-4739-2f70-08debdf8f788 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:13.6769 (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: /fJIkJQ3JmwJL5AGxl7bF4cHU5M1wak1vTMpy9Rgm259xrAUAwJV4hSfYdF4yy47wr9cRr2VqLDjzkyZkCiGbA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" FSP communication uses a pair of non-circular queues in the FSP falcon's EMEM, one for messages from the driver to FSP and one for replies, with the driver polling for response data. Add the queue registers and the low-level helpers used by the higher-level FSP message layer. Signed-off-by: John Hubbard --- drivers/gpu/nova-core/falcon/fsp.rs | 61 ++++++++++++++++++++++++++++- drivers/gpu/nova-core/regs.rs | 21 ++++++++++ 2 files changed, 80 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nova-core/falcon/fsp.rs b/drivers/gpu/nova-core/fa= lcon/fsp.rs index 7067c1963745..57880c4289cc 100644 --- a/drivers/gpu/nova-core/falcon/fsp.rs +++ b/drivers/gpu/nova-core/falcon/fsp.rs @@ -112,7 +112,6 @@ impl Falcon { /// /// `data` is interpreted as little-endian 32-bit words. Returns `EINV= AL` /// if `offset` or the `data` length is not 4-byte aligned. - #[expect(dead_code)] fn write_emem(&mut self, bar: &Bar0, offset: u32, data: &[u8]) -> Resu= lt { if offset % 4 !=3D 0 || data.len() % 4 !=3D 0 { return Err(EINVAL); @@ -131,7 +130,6 @@ fn write_emem(&mut self, bar: &Bar0, offset: u32, data:= &[u8]) -> Result { /// /// `data` is stored as little-endian 32-bit words. Returns `EINVAL` if /// `offset` or the `data` length is not 4-byte aligned. - #[expect(dead_code)] fn read_emem(&mut self, bar: &Bar0, offset: u32, data: &mut [u8]) -> R= esult { if offset % 4 !=3D 0 || data.len() % 4 !=3D 0 { return Err(EINVAL); @@ -145,4 +143,63 @@ fn read_emem(&mut self, bar: &Bar0, offset: u32, data:= &mut [u8]) -> Result { =20 Ok(()) } + + /// Poll FSP for incoming data. + /// + /// Returns the size of available data in bytes, or 0 if no data is av= ailable. + /// + /// The FSP message queue is not circular. Pointers are reset to 0 aft= er each + /// message exchange, so `tail >=3D head` is always true when data is = present. + #[expect(dead_code)] + pub(crate) fn poll_msgq(&self, bar: &Bar0) -> u32 { + let head =3D bar.read(regs::NV_PFSP_MSGQ_HEAD).address(); + let tail =3D bar.read(regs::NV_PFSP_MSGQ_TAIL).address(); + + if head =3D=3D tail { + return 0; + } + + // TAIL points at last DWORD written, so add 4 to get total size + tail.saturating_sub(head) + 4 + } + + /// Writes `packet` to FSP EMEM and updates the queue pointers to noti= fy FSP. + /// + /// Returns `EINVAL` if `packet` is empty or its length is not 4-byte = aligned. + #[expect(dead_code)] + pub(crate) fn send_msg(&mut self, bar: &Bar0, packet: &[u8]) -> Result= { + if packet.is_empty() { + return Err(EINVAL); + } + + // Write message to EMEM at offset 0 (validates 4-byte alignment) + self.write_emem(bar, 0, packet)?; + + // Update queue pointers. TAIL points at the last DWORD written. + let tail_offset =3D u32::try_from(packet.len() - 4).map_err(|_| EI= NVAL)?; + bar.write_reg(regs::NV_PFSP_QUEUE_TAIL::zeroed().with_address(tail= _offset)); + bar.write_reg(regs::NV_PFSP_QUEUE_HEAD::zeroed().with_address(0)); + + Ok(()) + } + + /// Reads `size` bytes from FSP EMEM into `buffer` and resets the queu= e pointers. + /// + /// `size` comes from `poll_msgq`. Returns `EINVAL` if `size` is 0, ex= ceeds + /// `buffer`, or is not 4-byte aligned. + #[expect(dead_code)] + pub(crate) fn recv_msg(&mut self, bar: &Bar0, buffer: &mut [u8], size:= usize) -> Result { + if size =3D=3D 0 || size > buffer.len() { + return Err(EINVAL); + } + + // Read response from EMEM at offset 0 (validates 4-byte alignment) + self.read_emem(bar, 0, &mut buffer[..size])?; + + // Reset message queue pointers after reading + bar.write_reg(regs::NV_PFSP_MSGQ_TAIL::zeroed().with_address(0)); + bar.write_reg(regs::NV_PFSP_MSGQ_HEAD::zeroed().with_address(0)); + + Ok(()) + } } diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index 5871bbce7052..d4067efb8772 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -568,6 +568,27 @@ pub(crate) fn mem_scrubbing_done(self) -> bool { } } =20 +// FSP (Firmware System Processor) queue registers for Hopper/Blackwell Ch= ain of Trust. +// These registers manage falcon EMEM communication queues. + +register! { + pub(crate) NV_PFSP_QUEUE_HEAD(u32) @ 0x008f2c00 { + 31:0 address =3D> u32; + } + + pub(crate) NV_PFSP_QUEUE_TAIL(u32) @ 0x008f2c04 { + 31:0 address =3D> u32; + } + + pub(crate) NV_PFSP_MSGQ_HEAD(u32) @ 0x008f2c80 { + 31:0 address =3D> u32; + } + + pub(crate) NV_PFSP_MSGQ_TAIL(u32) @ 0x008f2c84 { + 31:0 address =3D> u32; + } +} + // The modules below provide registers that are not identical on all suppo= rted chips. They should // only be used in HAL modules. =20 --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 02C36348C46; Sat, 30 May 2026 03:10:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110638; cv=fail; b=P3LNu8YJcjXgMt6J1QD7c185U+CK1p5/t7fiYvhC4fVecGCwdxFajEPnbDMhSlekezCMIb9tiNTP7pGK+bT9ZepG/e5SQpZXpPL1dGGOdSPdSpaPymf/1zWg/52955V09pCjUffHL9E4o9BSGfSmTNPQFtErd01u9bSfSU5CDio= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110638; c=relaxed/simple; bh=gX3ZRKDRhjJTf/yqeZ7bu7JPPLQIMJuYH+OrwwZQV8s=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=VDYNLr2GVcPt44WqNHM2xhWCF53DiX0vunlBK8yZn2UIuXx+omXZ/5HwtQg2KTo2CJass1GPDPH+6/hwsCqwfn8KajBhVf71G1UvpL6/YQ8U2CcKosI+fub7uErS8vjcrPKwof0q3d+bvnW8To4Z77xXDKvm5x/j1yLGNyPbAzo= 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=eynYdpsY; arc=fail smtp.client-ip=40.93.201.22 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="eynYdpsY" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XH8B4TLruR1WcdMTae0NpwjVhcwOws/D/G5XIQKRHcQdx5GrgUeBSfhSrU3sW82LC+yMMgKoTJNM2kHnpjLAoBXlsXRbHWunvpKzmba95GLf3QBP16U1E+psK4OjwN5CEMEP6JJOe5EMd7R0mAmcQJYJ0RIJU9Hxe8SbYv4jEN37G2ie/YbQrF8r0cou0PhUsjhtBvpNYQLfILLPAi+Q6+NLhEuWFxCHZO0BeKYj6qVr9Lz/nxBbza42MAEfWIJLRB9sDZ8FEAhMfws7nYIaZ7s5jmp5bXFtev3vC0+XedJoTuHt+a7ciL99JYYGIU0CJ1e8WlRh9K0e7G31GhPsvw== 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=8veI0sn7nGvSVaL820Au6SL2rMDeFEkkNwJUUX5MbEo=; b=ExUP+Kv/NDJmkAmDC8o+g5l5npkoQbf66RkyZQZelxFV40YDle84oK3RSl6pTROaGTElN3As8o++efeOlDrAF0KERCnzyeBIS+1/t86Yv5jvDqsAGAKBCpxdt++86vy3ZLJ68iEVQoCSCDTAc5G/gTQc3oI3X7MQ3bN9mQciQ8GFffzBR9TqYxHhdrbjeTSP0oOsHE5AySXXY+KNDEYfhujjUeDjmcQKPFrQXwsDclnIafTBDg848h22iXZWt5Ll8UR2A8d/mG9NRgwR7IdOwnK4Ig3fwkFt3J0oENiMZxXv6OBuTNAWxDdO+GmBFiGsQ5U5h87SlWBWZFrgraxtEw== 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=8veI0sn7nGvSVaL820Au6SL2rMDeFEkkNwJUUX5MbEo=; b=eynYdpsYVgex9PSMBqJXB2vj5191KR3otqNu0HIcblXON7YEzNCVfU3R9EjVPFvzNyRwN5Hr+o4ut4ZrhDOqibrh10wGz30MglLvVj/CcYf7AIXxdeuCzhDFCrbhyQvLonQNpIBWPpfAcVxrdAWL3jYabYWaUR2bnZlnLfIZvDuaSsN8XpR1Us5sbJOxjLrG/IHl8gTLRyUP4VjNFLfq1TQx+/B2GTTR/InyMP9I077Wv0nMOo5AZTe+/WVOPb+aNzGfHmqVTthL4x8Kpt70Llxmhew9tuv7MOR1YD2+zHEzeHCxHc5MKzye9hlCir2f5Hit5xWPFndZatu96PdwrQ== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:15 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:15 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 16/22] gpu: nova-core: add MCTP/NVDM protocol types for firmware communication Date: Fri, 29 May 2026 20:09:47 -0700 Message-ID: <20260530030953.740561-17-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR05CA0112.namprd05.prod.outlook.com (2603:10b6:a03:334::27) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: 2265d0bb-66a2-4f96-25c6-08debdf8f859 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|3023799007|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: 3hiT6up3FrHmDPJkR4zge1riJKogXd7Fyl/Rwq7xwbj1NSMLsARKB54NvsSSe8PkRfEtc6WJGrY5SVgafW5y0nEzeUxAOLGf3CDwvb8Ka81ymj72x7+r+NeJfiA+PwLT1tEzI62NsSaDmZ8QFr+NS7m1LrpTnNJH48pMaURuANcyArbQm0ZGGhWV44rchcnX281PxVi/sqWgTcHuPK8hi2P+uIQSM6wzTuUi42sDKx7+oOfSyeHLFK4PcbrNzWQs1fitnY55Qm0RvdHtuAXQD8Q7B4DC3fia/R9hErIlwzfwvtIRp94Gw5gHSmqmy6xdpUYuRE0GhJ1YZhGrh8H3osvqDPXiyKqq6P2laRXcP0HoqWUYweOWYCp/Vz99wiyv69yMJ28YScMdDPhjNXd0F5rMcDVKu/SecV7wj0LIOJIpTHLR+bCY56eKfNvbomGCju8rgcQanePnLh9yI2ViWy1TC7L5VwbhOss9GeeEoYNCOFzEahIjwH1i2Z+qGSv15CSmecvPulqXWxxncOIM8JDAYwCQd5ULA5U71ZRyyWRu7+HpGElFtuG5N21qf1KgyABeOTNdxif2peVtGY2o/l5IkKDLyGMTrdToJvHNMu2d/nQ1QLIHrp+OEfOBjobFlIxYZ4KJ4vOvlGPJW7jJK6mXLUAbfn4SpcF9B2gig74+YYeNcX49oxdjiXQYcxhn 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)(366016)(376014)(7416014)(1800799024)(3023799007)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?3BNZ87xAIbzpSYXGPLcMLcykNGdBqUXfPTHSGV1dZAKCapabv+ELklodeZyW?= =?us-ascii?Q?HQGo6eCuRz75x0hshW5DucVGu0vdg4novM9ztUhsHHEP0UqQRPsnuG0dno6y?= =?us-ascii?Q?TYmGh4R2A6Wp2IayQbdV6H7+/ArzdDvi6/a1a9rbYPFsh4z+7Wia9cp0RozL?= =?us-ascii?Q?pF5tdR4lhLuV8P/IAxoFnpMCtbEs7nstkTUW9TaE12AFsrbqWXKRhRqCXGXH?= =?us-ascii?Q?oSw43vA88xbx6LlXIJunLSkB3xKDBtfOjDF0rQxv9ILa/UpQDyjZZ7Tzc9pv?= =?us-ascii?Q?yn8l4jrgIWtFNMWhL/5s3Z4+nDIEyqjoJ+xHE8GHCqv7N8XoO89XH3Tag5zj?= =?us-ascii?Q?rCPO03jRuhtcOP2NeTX3CqZ4Dg4UreNNR0VGnHJieRuAIeA0+AdkIJl0lCQq?= =?us-ascii?Q?aGbgMgaZ93KfA1AkTOg/9LEk6k0yM8QV09FGduG8g8NKaJIb+7z5S8ZLRPLL?= =?us-ascii?Q?0z4yr509evCXZvOW03j/nR3ErHV1gLEj9lxTD1BeqkFskZ1X7BSANJtd2qLm?= =?us-ascii?Q?fc1SSd3dMLrwy07nqQtgdYBSEroCqPKT3SZrFPED967mLEQ15NQcylY//ZiH?= =?us-ascii?Q?dwvgRdBJv8yCuTUnABQhKFPLN4RQ/4yqxOI8lwZesM01z5RJpajwQ1ZRlI8g?= =?us-ascii?Q?Z2r1B9IpayA90aTag1mpBEnudZFmf+3rq89fSnEGJj42ZOIuWytJGHrKIxoX?= =?us-ascii?Q?CUJUCLcdX9sH+7PqvzekeuJm1GlYY0kCk4yUnJieEaTbCXjjERgQHbWra3Dd?= =?us-ascii?Q?M6jTDsUb6efvxEESmp1vQoFCDLfUmZXMsPVHtmGuDLTdguPdhfIsUpKv0opN?= =?us-ascii?Q?hnvP2zNxjXlZuABb/yGWCuC+1/yM2+WUkRYpZlbEJcXsPGTK8HyLLEJzxLEb?= =?us-ascii?Q?VkCsBc4PBOmERB32kqWMPCC83Wok4JS+3dHd2/tCt07QePjv0hrm1QMIxMN1?= =?us-ascii?Q?gRxK2wyqa1QE9dqwRSXmxPs496NmSAHQ5hDtc6X1zRmnBb1ycSlOunl9LNkc?= =?us-ascii?Q?di52N+bFVyYy1g7vmc0OwyViNcWCD4Dvo3tg1Qb5DF8VkX1Grh5IFEi4yjYs?= =?us-ascii?Q?PlMtND6oFq1OXJm7qAoSM/3vwgYtWbpAgkl+jdb2EU74UGklf7Jz3EsOBPY8?= =?us-ascii?Q?j6FO8toJyHKMRuNHDbvPQtkr95MnOGoqiTZnS3dg8DffjhvPQPLnx6b9Rp8g?= =?us-ascii?Q?yb8F7YWFP7EZj7Yv0zhe/s/Gk0OOKAR1gx5C8OfAiZiftSuTINSuwcXxNyjb?= =?us-ascii?Q?ELwJ/xBO0ZKrEr6WeZlmwTYUWREN/v42nhtsTq862s6NqpoNpXe122vrumlo?= =?us-ascii?Q?QYhdVhG1oHybt/i0rednAHBzt0VkssCSpdtS8QGC2t57W1l6a9JGvcX4jse+?= =?us-ascii?Q?YFZvPCZQlRxn95pkbCnuyI128kbdDaLwH48qnOWnI/EPyJ/7C6CsGWmINeMk?= =?us-ascii?Q?bX/fzqs9PIbsjOXATgV/oHaD2F69ioQ12bP4+gUXXiF5FX7h0h5fc93+L0Ic?= =?us-ascii?Q?zzRz4bhQnfyLfykaklAuSVly0bhDfvV15SKtPY3MaSobjFitJwDx36PHrNSg?= =?us-ascii?Q?KIJbB5jurdysrpp06Q8KuBXYAeb/VnbqLwiY+IFROmzz1mm1MS6ugF5U20iH?= =?us-ascii?Q?9aGA7se4d0ZZHuPMxVZGYaTUdWGt4em4Wd+b7hGOXtVUeeJ8gYxd4Co/aCMU?= =?us-ascii?Q?cU4+G2JUybAQFAPB3aac5k4cJxNQcmaISpbFMK0pFZfo2ldf6/oWeLn/ywvB?= =?us-ascii?Q?Qz5AJUtCMA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2265d0bb-66a2-4f96-25c6-08debdf8f859 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:15.1996 (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: AyeGuW9kMp8KIp0N/2WpxSDNP+iDMIEKbmS16yV4cjhZ+wYJf0MD2J7Gd28tTINUwYDdMGgc8MSUZF4Nz/W5KQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" Add the MCTP (Management Component Transport Protocol) and NVDM (NVIDIA Device Management) wire-format types used for communication between the kernel driver and GPU firmware processors. This includes typed MCTP transport headers, NVDM message headers, and NVDM message type identifiers. Both the FSP boot path and the upcoming GSP RPC message queue share this protocol layer. Signed-off-by: John Hubbard --- drivers/gpu/nova-core/mctp.rs | 102 +++++++++++++++++++++++++++++ drivers/gpu/nova-core/nova_core.rs | 1 + 2 files changed, 103 insertions(+) create mode 100644 drivers/gpu/nova-core/mctp.rs diff --git a/drivers/gpu/nova-core/mctp.rs b/drivers/gpu/nova-core/mctp.rs new file mode 100644 index 000000000000..a13146dc0cca --- /dev/null +++ b/drivers/gpu/nova-core/mctp.rs @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! MCTP/NVDM protocol types for NVIDIA GPU firmware communication. +//! +//! MCTP (Management Component Transport Protocol) carries NVDM (NVIDIA +//! Device Management) messages between the kernel driver and GPU firmware +//! processors such as FSP and GSP. + +#![expect(dead_code)] + +use kernel::pci::Vendor; + +/// NVDM message type identifiers carried over MCTP. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +#[repr(u8)] +pub(crate) enum NvdmType { + #[default] + /// Chain of Trust boot message. + Cot =3D 0x14, + /// FSP command response. + FspResponse =3D 0x15, +} + +impl TryFrom for NvdmType { + type Error =3D u8; + + fn try_from(value: u8) -> Result { + match value { + x if x =3D=3D u8::from(Self::Cot) =3D> Ok(Self::Cot), + x if x =3D=3D u8::from(Self::FspResponse) =3D> Ok(Self::FspRes= ponse), + _ =3D> Err(value), + } + } +} + +impl From for u8 { + fn from(value: NvdmType) -> Self { + value as u8 + } +} + +bitfield! { + pub(crate) struct MctpHeader(u32), "MCTP transport header for NVIDIA f= irmware messages." { + 31:31 som as bool, "Start-of-message bit."; + 30:30 eom as bool, "End-of-message bit."; + 29:28 seq as u8, "Packet sequence number."; + 23:16 seid as u8, "Source endpoint ID."; + } +} + +impl MctpHeader { + /// Builds a single-packet MCTP header (`SOM=3D1`, `EOM=3D1`, `SEQ=3D0= `, `SEID=3D0`). + pub(crate) fn single_packet() -> Self { + Self::default().set_som(true).set_eom(true) + } + + /// Returns whether this is a complete single-packet message (`SOM=3D1= ` and `EOM=3D1`). + pub(crate) fn is_single_packet(self) -> bool { + self.som() && self.eom() + } +} + +impl From for MctpHeader { + fn from(raw: u32) -> Self { + Self(raw) + } +} + +/// MCTP message type for PCI vendor-defined messages. +const MSG_TYPE_VENDOR_PCI: u8 =3D 0x7e; + +bitfield! { + pub(crate) struct NvdmHeader(u32), "NVIDIA Vendor-Defined Message head= er over MCTP." { + 31:24 nvdm_type as u8 ?=3D> NvdmType, "NVDM message type."; + 23:8 vendor_id as u16, "PCI vendor ID."; + 6:0 msg_type as u8, "MCTP vendor-defined message type."; + } +} + +impl NvdmHeader { + /// Builds an NVDM header for the given message type. + pub(crate) fn new(nvdm_type: NvdmType) -> Self { + Self::default() + .set_msg_type(MSG_TYPE_VENDOR_PCI) + .set_vendor_id(Vendor::NVIDIA.as_raw()) + .set_nvdm_type(nvdm_type) + } + + /// Validates this header against the expected NVIDIA NVDM format and = type. + pub(crate) fn validate(self, expected_type: NvdmType) -> bool { + self.msg_type() =3D=3D MSG_TYPE_VENDOR_PCI + && self.vendor_id() =3D=3D Vendor::NVIDIA.as_raw() + && matches!(self.nvdm_type(), Ok(nvdm_type) if nvdm_type =3D= =3D expected_type) + } +} + +impl From for NvdmHeader { + fn from(raw: u32) -> Self { + Self(raw) + } +} diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nov= a_core.rs index 7b6c331da10e..9f0199f7b38c 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -20,6 +20,7 @@ mod fsp; mod gpu; mod gsp; +mod mctp; #[macro_use] mod num; mod regs; --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 69A2D34B1A6; Sat, 30 May 2026 03:10:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110640; cv=fail; b=q8NqkB/CO+wJzcbbY8+EB2cLkw6QZ5DSf6IGkN+svumtB81SfQxG/ng9aILGK1pR0rZdfcU+GY9Lq4+C/KJ2KA00dcy4ZyRMI79x8POCaMOmNDAU14Qu05p67qWy/wd6ocqK97nORIue+9r4h+OX2bavpN6AicLjE8NLsgcVYyE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110640; c=relaxed/simple; bh=hE65RrLn9QfkDx5WDGcPkqIT8V4A25AuWGe6Nu92f8k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=cCPIZ4jT0mmbHObKwJ/RITobcjeOxjUV8fZFe+4CmqDji3cD4VT4ExaWPrs1RbIuEgEAhPYr+qPdSaKaRfpBrf6VawkYqKT7NaGJ8YQUzqRZzX5SIZqhg1ou9EVAD2Q75i9T+satg5GyqTgWoS7TMRKyHOXwOqtRtTKP9nDcJ/c= 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=UviKSSXm; arc=fail smtp.client-ip=40.93.201.22 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="UviKSSXm" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=riwKmu736gDheT5dwu86N9oTfufi4SIZGsF9EBRZvil6zTIpWuoGOrsoThPo4g4vsyDt8FuDNbN2Lzt4AHJDjr7AHK5d0MweTIo8Qk2hkjjzSVwOeCbbCgCidCx+rNw2V03ISlPKtRoJn3+FSkDj/FMjTAiSfLB8J8O9IE8VL3Eb1SgLkAOgkJbO8IUKfzpacM1pSATtqdUwem4S3CLK/5bozf8UtUJjuYjgSpLKvqa9MxDl4qMUSy4sNrv0FezBWaB0k/yOEf1vgAvb+n6OF6iJ3jbn7695/R6wF5Rg3IGFnYvD8bhPZJ9DG84IL6Y/LRxWQY86Ctoes7PVNepsYA== 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=jeWXXJj0chN7FUBLpO0RHrbZfx2kYvTNw49aKEn23jE=; b=rt7eX45g9ST12oKarKlDwPRyYv5X5RPAz7HLTBtu+TsSnrLyDBM+c4ErRFxAWOy5bhGnS8tuzVlzGsOX5iW6LmDo9R9jT4WzuScdN+W3k0zDZAMPEQGf8MMh/D+HnrSfHm7PwqpN7R1wBnudgDloMHEr5mzCDEDVD4PABxCLQvt+ULZvYATyffvfHhu6GsznY5hmmWkI9gPVCmK/BkPMR6+PdbMkwIFz5iZYt0TAgVtfnXPQasMA3dmOE0rS3tZjFBWFzo2/nmaUFJ2E76Gf7BXb14axUbOe3I55WPPH5s0el1HcLjZqWkPg+wq8GhwR4Q1tPVaYQoecUG58mRj5ww== 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=jeWXXJj0chN7FUBLpO0RHrbZfx2kYvTNw49aKEn23jE=; b=UviKSSXma5MsPsmLdneOhdeTvDLisqjxg8lbfEolFlrnM8O25lH+uKbx8gittekNNxM21Yk+yPihIsZH6aHxW96RiofPtrWsTVwxwzTi9J92fiBIuWjHplAyvfcoBFLmVlIzM6BOYnaEdiS2Et1ZMfiAkaG4XCp84tNFsV2KWhEVEVKe4BhD9Vz3HEbLcomdFRGb+l/MayCLeCZchDsWgjV6dwah3ut0LDSmyVORbZfvOniAZjhkEbpfyjZpZhqyv2UOmW5TU2GzASVdTSoMkO55w0bxa12yx+xWzeCx1C3QPyCec0OQ+HgtfOfSlBMrej3jqm4qZiYBuU7o9ZDAYg== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:17 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:17 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 17/22] gpu: nova-core: Hopper/Blackwell: add FSP send/receive messaging Date: Fri, 29 May 2026 20:09:48 -0700 Message-ID: <20260530030953.740561-18-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR05CA0113.namprd05.prod.outlook.com (2603:10b6:a03:334::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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: 7a3826b4-e7a5-4578-4a8a-08debdf8f949 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|6133799003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: y9ND9TyNuVBsVb/Quf8rCR3MMLyl2QF9JjLyWnzwXvWH8NgsPYY85mbQWpVZ9obx3pkav8AsSPZO+FEciyhcIFJIAqXUFwTDGLJ+qvXNGxQ7uVW3yfQobnKyqd9S7KdooR64V++EdyiIdUQICeUpo+c0wOZPjlWC5JaYcmi+J+Y1rVzA7l0qBj59qOpQrj4k20aCYBRSFp79rfYwwUJj84BfBgTl/nAKS3+41Hc7GvxpAfpLm2l0IHpBGBfMk0eqHOdnEAyVnw6IFlCNIHGPCRvZcNCTgJ3bvLMOVORZ1cJJ+78IL4mwdfS3Acd3ZNNcWp9Gfz9lSn0+JLxPdx5kfymnsw/X3KqxtN2n4y3hT2yG6eXT9UzCr1mgAGWew/cYxgy0fMtrRZmeHgRau0pNkwdNKrzKhLfOfC8Q7mP/rQT9/wWchl7JaC3O/kIokfZbVj4ewDvR8nTRdZM8NKpTBrQdq+ZeBnvv9XflWsYxRvNl9dtzCulc2YBOOqtwBKaoZrmzcKOEeGGNNbjKgnWOjqS5LZNx724jq4O1ePsXqQKjFj6GtZLeFXIXbiWwtryyj8pwHJn3ee3IxNzlWS0NNAxNcb1TnYUyZpv7dhRZFW5uta876Xoz1IJ4cUj3CrcbMacTtQFSp5Msm6BAfFQhUVA6KVWEJv4y79nqc810qmZk5AXpfN2cOwe/VUJQXRTp 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)(366016)(376014)(7416014)(1800799024)(6133799003)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?6SrHl1hWt/g0TMhimyYslPfkSVEuFMYnGodTgDQ4I1TzPIcwjqxAtwhx7KQN?= =?us-ascii?Q?reT1JBlyNF/+IWZETsbEVD8Fxyl3HhDMqLd7rGT5IR7PJZHehGulpn9PXUdb?= =?us-ascii?Q?phgDnI/z3UfbwcwDCetI9xwmxlsj9nXaKIm80cTsC0L679lu5GnNe9bXiFu1?= =?us-ascii?Q?CBIUeUxI+0MW0SrD2ezdjrgUk/yOZDtXxq9ynfPMq0KGCu9HOKP0FXCglg1T?= =?us-ascii?Q?GwSZf2QK9w1S0Vnp85TOgW8q8MrLq7mA8xWVaG+Er1rL6bEm+s23zzWk4yLE?= =?us-ascii?Q?YXnNCrWoeCGntaB/HbvIKMjVkffI1svsJuin5rrN5REcpb85uItyd3R7q1On?= =?us-ascii?Q?YruTQfSj7b46cLMoe67/nkYcT66CaCr8BZ1BYWYHAmHNdvdvVois5c2jxXrc?= =?us-ascii?Q?FPzd6sMBVwNWZvv7eEkn0kbzLXBUrHLYy5n3nJWltIjL2FNN+y5OazhsucsX?= =?us-ascii?Q?Ai/T69xMIJa6y+UIstr32Kt11gEfD+UvvLCUIUmiva+ducSCojNCqS1m0S+B?= =?us-ascii?Q?fseSBY3efXBKPzS0zqZFgaIjFVwC0x5Lb9+ihRqDzncKo7uQNOXczpWIOCqs?= =?us-ascii?Q?l/QFRH/X3I987SjGScMPSVqK6TgPVJVMLaAZplIlZ0Df0k19NFPqtXOlJs2f?= =?us-ascii?Q?x49G0zDR905dES7dJHU1CyfSArzE5x5dRVZgmgeqPIUClg9jm2PWh2oDYXSt?= =?us-ascii?Q?v5iq+wL+WcfnEg15K2o2tM6QJ4koqOLoZ4U1VfO+aFimtbwPV/BX3VPA5iKk?= =?us-ascii?Q?x9auXzsP6TWDeTsQ0R707FhQiD+xNjiRhwrGw88TPNZUUmG7MoVNioFxs0J6?= =?us-ascii?Q?tIhU4+V2lbKaJCeyX1AeJs3t5O2SljDG/b3NIdT7PAp0e1rmk8CBOk1RVuO0?= =?us-ascii?Q?HIK4dQl666gatmgfMgvaKP3fbK46t+BLj1DFWBniC/VH564Zx6+Lr5n8kXcW?= =?us-ascii?Q?y0AjIc9sAgs5yLFxGBrSkdw4RlaDRfxxH19R9wqjCmFVRlWgCH3NizW1e41b?= =?us-ascii?Q?rNHvoYqZEPgmPCpfRiumxGjEnji2kSabAfZQt2nH8YK1ziTaZn8G9HSoiBgq?= =?us-ascii?Q?d9N94HTxND8XK/tLAhfAU1+kDMdt91Df6rrlvIYWQYohXZoD+NJdFkinYj67?= =?us-ascii?Q?cq1T8aS0ZryogMqvV76VpO3eFxnqQUG5AHBomji0X6wZSg9kyYqSJhWQUXbU?= =?us-ascii?Q?gFVAzSt78AQyy7OYvLFsJoBfXIKk2v8jCy3dbe9WNYcVtGJhbLWMlAlyWCyQ?= =?us-ascii?Q?GQq/j/laALBq+5BmJaEpz4Z6hPiwZZ+NAeuGXN+wcnABk6XWac71dk+UHgz5?= =?us-ascii?Q?zRZK98loT/N1AMiOo7p+rNAcMst65jWBVYVh3NTB9HOoHUjhX75jaIlHYKaO?= =?us-ascii?Q?Xn0XHe9DMxLMKsS6OztHbPjrQ5Eyyf158UBnZGmSPqejoCfDQXN/o1pnb6UU?= =?us-ascii?Q?ZEzou7EcJ7jAfkLv6aMpOZHzsxDH6SKzeu3cTGyKEJiw1hmBzxK0p//ZzPYk?= =?us-ascii?Q?48BQD4oJeu/7T3Lcnw2Y5pxPNWnfq+/1mAYp+L+B+7fdoC9AcgQ+ePuuwX/A?= =?us-ascii?Q?ESu/QyoPdrPLeke+bifThvly9UjQEYnJz/7/WDUDlUqwo02tF41llkPZU3Bi?= =?us-ascii?Q?6I2eV7bxBV/ud5u73x9lPGqmcVg1Wsb1L5c1OgPMg90qAB+md1xo0HeKzbdC?= =?us-ascii?Q?1ww+ZaDh67k03dA/eUeqWEO/QPAWYBAetfHUCbtoAwE65Z/B0F3dd5b/MTv8?= =?us-ascii?Q?4NJ92dKdjw=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 7a3826b4-e7a5-4578-4a8a-08debdf8f949 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:17.5323 (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: O0Lhy+p4NRnwDUlEEzV9wOrnyoR5jAHvNTAukrEStf3fCcB97ea76cj98NTvexp61CAkQEDhWq1by+/jv8egyg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" FSP exchanges are request/response: the driver sends an MCTP/NVDM message and must match the reply against the request before acting on it. Add the synchronous send-and-wait path that validates the response transport and message headers and confirms the reply corresponds to the request that was sent. Signed-off-by: John Hubbard --- drivers/gpu/nova-core/falcon/fsp.rs | 3 - drivers/gpu/nova-core/fsp.rs | 129 +++++++++++++++++++++++++++- 2 files changed, 128 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/nova-core/falcon/fsp.rs b/drivers/gpu/nova-core/fa= lcon/fsp.rs index 57880c4289cc..a3345121485d 100644 --- a/drivers/gpu/nova-core/falcon/fsp.rs +++ b/drivers/gpu/nova-core/falcon/fsp.rs @@ -150,7 +150,6 @@ fn read_emem(&mut self, bar: &Bar0, offset: u32, data: = &mut [u8]) -> Result { /// /// The FSP message queue is not circular. Pointers are reset to 0 aft= er each /// message exchange, so `tail >=3D head` is always true when data is = present. - #[expect(dead_code)] pub(crate) fn poll_msgq(&self, bar: &Bar0) -> u32 { let head =3D bar.read(regs::NV_PFSP_MSGQ_HEAD).address(); let tail =3D bar.read(regs::NV_PFSP_MSGQ_TAIL).address(); @@ -166,7 +165,6 @@ pub(crate) fn poll_msgq(&self, bar: &Bar0) -> u32 { /// Writes `packet` to FSP EMEM and updates the queue pointers to noti= fy FSP. /// /// Returns `EINVAL` if `packet` is empty or its length is not 4-byte = aligned. - #[expect(dead_code)] pub(crate) fn send_msg(&mut self, bar: &Bar0, packet: &[u8]) -> Result= { if packet.is_empty() { return Err(EINVAL); @@ -187,7 +185,6 @@ pub(crate) fn send_msg(&mut self, bar: &Bar0, packet: &= [u8]) -> Result { /// /// `size` comes from `poll_msgq`. Returns `EINVAL` if `size` is 0, ex= ceeds /// `buffer`, or is not 4-byte aligned. - #[expect(dead_code)] pub(crate) fn recv_msg(&mut self, bar: &Bar0, buffer: &mut [u8], size:= usize) -> Result { if size =3D=3D 0 || size > buffer.len() { return Err(EINVAL); diff --git a/drivers/gpu/nova-core/fsp.rs b/drivers/gpu/nova-core/fsp.rs index ee8fc384fe38..cc2ebc3f6e78 100644 --- a/drivers/gpu/nova-core/fsp.rs +++ b/drivers/gpu/nova-core/fsp.rs @@ -11,17 +11,64 @@ device, io::poll::read_poll_timeout, prelude::*, - time::Delta, // + time::Delta, + transmute::{ + AsBytes, + FromBytes, // + }, }; =20 use crate::{ driver::Bar0, + falcon::{ + self, + Falcon, // + }, gpu::Chipset, + mctp::{ + MctpHeader, + NvdmHeader, + NvdmType, // + }, + num, regs, // }; =20 mod hal; =20 +/// FSP message timeout in milliseconds. +const FSP_MSG_TIMEOUT_MS: i64 =3D 2000; + +/// FSP command response payload (`NVDM_PAYLOAD_COMMAND_RESPONSE`). +#[repr(C, packed)] +#[derive(Clone, Copy)] +struct NvdmPayloadCommandResponse { + task_id: u32, + command_nvdm_type: u32, + error_code: u32, +} + +/// Complete FSP response structure with MCTP and NVDM headers. +#[repr(C, packed)] +#[derive(Clone, Copy)] +struct FspResponse { + mctp_header: MctpHeader, + nvdm_header: NvdmHeader, + response: NvdmPayloadCommandResponse, +} + +// SAFETY: FspResponse is a packed C struct with only integral fields. +unsafe impl FromBytes for FspResponse {} + +/// Trait implemented by types representing a message to send to FSP. +/// +/// This provides [`Fsp::send_sync_fsp`] with the information it needs to = send +/// a given message, following the same pattern as GSP's `CommandToGsp`. +pub(crate) trait MessageToFsp: AsBytes { + /// NVDM type identifying this message to FSP. + const NVDM_TYPE: u32; +} + /// FSP interface for Hopper/Blackwell GPUs. pub(crate) struct Fsp; =20 @@ -48,4 +95,84 @@ pub(crate) fn wait_secure_boot(dev: &device::Device, bar= : &Bar0, chipset: Chipse }) .map(|_| ()) } + + /// Sends a message to FSP and waits for the response. + #[expect(dead_code)] + fn send_sync_fsp( + dev: &device::Device, + bar: &Bar0, + fsp_falcon: &mut Falcon, + msg: &M, + ) -> Result + where + M: MessageToFsp, + { + fsp_falcon.send_msg(bar, msg.as_bytes())?; + + let packet_size =3D read_poll_timeout( + || Ok(fsp_falcon.poll_msgq(bar)), + |&size| size > 0, + Delta::from_millis(10), + Delta::from_millis(FSP_MSG_TIMEOUT_MS), + ) + .map_err(|_| { + dev_err!(dev, "FSP response timeout\n"); + ETIMEDOUT + })?; + + let packet_size =3D num::u32_as_usize(packet_size); + let mut response_buf =3D KVec::::new(); + response_buf.resize(packet_size, 0, GFP_KERNEL)?; + fsp_falcon.recv_msg(bar, &mut response_buf, packet_size)?; + + let (response, _) =3D FspResponse::from_bytes_prefix(&response_buf= [..]).ok_or_else(|| { + dev_err!(dev, "FSP response too small: {}\n", response_buf.len= ()); + EIO + })?; + + let mctp_header =3D response.mctp_header; + let nvdm_header =3D response.nvdm_header; + let command_nvdm_type =3D response.response.command_nvdm_type; + let error_code =3D response.response.error_code; + + if !mctp_header.is_single_packet() { + dev_err!( + dev, + "Unexpected MCTP header in FSP reply: {:x?}\n", + mctp_header, + ); + return Err(EIO); + } + + if !nvdm_header.validate(NvdmType::FspResponse) { + dev_err!( + dev, + "Unexpected NVDM header in FSP reply: {:x?}\n", + nvdm_header, + ); + return Err(EIO); + } + + if command_nvdm_type !=3D M::NVDM_TYPE { + dev_err!( + dev, + "Expected NVDM type {:#x} in reply, got {:#x}\n", + M::NVDM_TYPE, + command_nvdm_type + ); + return Err(EIO); + } + + if error_code !=3D 0 { + dev_err!( + dev, + "NVDM command {:#x} failed with error {:#x}\n", + M::NVDM_TYPE, + error_code + ); + return Err(EIO); + } + + Ok(()) + } } --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010071.outbound.protection.outlook.com [52.101.85.71]) (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 8B9173546CC; Sat, 30 May 2026 03:10:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.71 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110644; cv=fail; b=Bf+PXrSVmwYHHCH+80aWqmNBz7ukiqced5BvBR6f+XHMf8TtXfAKapiycI1DqOVqZSM5olvMfToiGe4xsSBD6t9CtK3dJPaglWnppXVi3kwabL9OWFsAdXNmmMMrNG6FpETJSFtTQeRQ2IsU13yXScG3MHByesJnkZfgzd82asA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110644; c=relaxed/simple; bh=Kr7Lu38lFzHC8ePJWYedhawvoaVgOgJiW4Ih6FbdBmA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=ghPV93TZ+WtQDKd/+S7vBBSZ/ElEY7l6uf5QbBNThHrxHe+fUVhAxG3D6RiqSJHjeFs0Azj04VadioxYyKjvbWN57jR+KVm8v/+4hp9klI8KBWnDtCL/pWb8ZRmmCh854PwKDrw4GF380PO/BNPWVS4aIWFREYqto30Ut6P14x0= 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=cEEWP87r; arc=fail smtp.client-ip=52.101.85.71 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="cEEWP87r" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BRNnYtdauB8CqnwONHQfqy9MgpzEnmgncYNT+ZnnnY0rjHKxRKtObNjsdiIwzXoHCFim+cX1IXhJzISrh8JcUDONEvTIHTdZZ9a9xThZPBC9fG+4/3heamopAMpfnz55EDPwdzAOG6pFbqJEjHcl1qxPjpOToAQmIQyhG3Mj3vbIFcPzhDm17tQMM39VF3lUFrDMNQH3mUAksJbhAaeIiYROScu0i2f+ilAzDvjFixV0BKSNWvenzcNe4dRmOKzvUdzh8f/iant1b+r9kQPLMhgvmHByg7xjRXp7hnD7S601ARmaZyghsxEzYxPXQ5p2rCs4JWn7GEoWrTzCQcCZlA== 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=V1U7Z/eXuLKTlrqmwx33e4dldB5aAD6I0MWF75o1Kp8=; b=QZUmONjQBNObCy9cM6Cv9WMleEE88UEIzxa05d0K48rmEY8lsPQ0z3sfYkylf0kqDhpZLqxigiL+VQUhSTvUUcsV0RC/eh3bQQZ8lhmMomGYtxC86uuaAcK08boBtRc2dn7MpvVh8EQpelkSPD40Fa3KuPf4Q8qmKDqMz1IcKe4KIH0QRk8M0B5VTj2gtolIV2hg27kKLk42j8CClvUSE/k2ZBHzVWxFBke6YtsJLm4Na+GPvH9M3CEwzPQtiASNac5M+KcxGzVD+6X00PeZBIkvPZ2Koi6eXK2ZshK/5lODxtDs29KHBuu5hoGREbGllkcfZ0lpkppDolSsFHoCfA== 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=V1U7Z/eXuLKTlrqmwx33e4dldB5aAD6I0MWF75o1Kp8=; b=cEEWP87rTKuY5a15pWd8926cyi0yOTd49JLUIHf3pmaInVrL3f5ZrMM8pZawYGdo1gHx2bke2MZnLG2Gu20KtNjMNjZqnqQ3EOS1l9qyeolNNX7mWxhJkOj679cp6O02z4hjO8OOeR6GXo+pmyJenfsnq3VZU0LczfvQoolJ6nkjE+GMSyRTOOKtbcGQdF6JbDDb/0rx2EgDPD/+cHJeFWom0CEtD1Q8fpnFft0rWk9qk8de8cZmHJVBDAhCZJiP8Ahuxg891GnvGvALZLyfHJYoHxOjtLA2+nMqz04eWFHkrOCaFylLAxwJjnoNvnRSBqJF4VXDdtwCLHlX2ycn3w== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:19 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:19 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 18/22] gpu: nova-core: Hopper/Blackwell: add FspCotVersion type Date: Fri, 29 May 2026 20:09:49 -0700 Message-ID: <20260530030953.740561-19-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0385.namprd03.prod.outlook.com (2603:10b6:a03:3a1::30) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: ea4b0c7e-979f-4cf3-dafe-08debdf8fa83 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|3023799007|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: r7VOKEUSmzvSG3DAKzXu0+Lv/EpEzOyslDpnUQpfnRzWSK8hUTrElNuzaW272r6CbvW3tZl74LM2Xjg6ErrdgeThhB7lqEFeRkNbQSUaoRcPEfAwbFbdezzFs+2UbqyTTHUJn0uNpsc4c93XZKZGZs45R52bxZYFMvIdA++NS6K/OS6Q1YcY+ViZk8XTOzKTdqLL80hEKN43JSqufBqvUj7Ov08RbdO0jUpOiba/ry1tcVMFOFyFANWB83gxVgVyAUbcCZvQBy9eLDLtKbR9Sd69m0RzlQXfRoBvzcCFZFXtEEyk73xCAv5mnF9xz0fVwAm7cZsH+Geo0WIyv1fd5AJxVpwX5pAV4lcOtiFcSYzXmI2RWk7aUV6iCEwVu/H4Ds8nBXDBzSg3IQYpcNI9IzvFReawLhwySFRvMClqCMGUDYOdf5qb2XI/0jaI662l8AD8AVM9cciUJ3GMsO7zMZR7giW0twppJJnS3ymFqN5rpDIfnpFsp2hdF6Dlo7Dp7w8b1Rn2l+oRKwTqCOOkFgaB4Onzcs6m/P1hQt8aou3IH1mFxE5QCLAXni9bovw93jcw4g7Onl9ejX4gIm+yv1oAgr4DWjwihUZ9KGQz6DelxvgCSxz279m7QkJ0iVcDWflPC0aRXietxUvN6i61r1OhmDJsbuL10Kp+VWqpC0uLmtjjWb9yIiGVCZduJtC8 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)(366016)(376014)(7416014)(1800799024)(3023799007)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?de6VEr01+1r6RQEPFu0GB38s8pt6+cCFUWtYoVey/NPSqEs3vvEmuybTWS9X?= =?us-ascii?Q?vzaZUAHr8YcydwpwW/S4t0C7iye6iUpJ2oV1wmcXh5cAI/EM0L0lAyHn6wJu?= =?us-ascii?Q?x92S6CRMFgEAaZpKZe0rfttGwvAbS6TOZs6mxe0tcNDVoIdkdoLo7dyTd151?= =?us-ascii?Q?V/y+YFJ3slo0Gu/hy3frIEyI5StU9eHf8iLTURrTOXUN+9Sw432vX8JUU2eW?= =?us-ascii?Q?55czywCUcjaA69DT8exoMrXU1DiQseHsmax/tuUCH7blYBHodkY80T1TaSJU?= =?us-ascii?Q?SMCLwMtuGPrsUNsfK4Z17V2XqhJ5rpRKaDAchXEn7wL9GnH+j3vtRuUt8ESa?= =?us-ascii?Q?et7KHeqghd1lzLq5j3A1Mp4r+PcGCPMQ2ztrnaghETO8Obh7ni/HigNQbds3?= =?us-ascii?Q?2rYIIuFQa7xwAkmQ1h24g5v1i9/4SjO3iS44qs48Zq0qtx2EQSIA9vt39MDe?= =?us-ascii?Q?2N5SwJYUZmqtrDj9+BfWItzs3vyetV+tLkFNZaUACSoilEd9VyF1kB7uEB5w?= =?us-ascii?Q?MMfJb/lHZCNNF7ahEnFRI1wJSvdHsdbF+E1aOfsV8wDCRpWiFCC/UO4SgZyI?= =?us-ascii?Q?3E7rWp6m4l/l6Xiky0FQpysjL72DWDjRydBr4xq+jlWnaEsKSg9y2sGLcLGR?= =?us-ascii?Q?Bom1I4n7p0S7KAYMpLKrTLgbGHrwc125WUxSRiO7ZawvuPnYOhJBJk1KXX2F?= =?us-ascii?Q?ThSnIpC/Xa97i9HfD6ty32+69uDr84Po5FvdJNHkwUuZLV4Kz62epQJoGhY0?= =?us-ascii?Q?zM/EDB4nqd0y2ut8+vPMIb70Gi3ndbNDINLvaUT04s+D2zfJpRj/H3DHuwfP?= =?us-ascii?Q?7RYqW5axpJfntFo/Ib3f+7UGr19IiuSAZq+Rx/NrXo3PrLv1t4R2vs9UKckn?= =?us-ascii?Q?8S98lPmniCHZhFOSi7o5IMnBtDhABBGZHEpAkd0/5ze7pZdSAUgwgdNPs/25?= =?us-ascii?Q?quuw/dgfY/9/qZe6QohBYxKeIYWMjCrA8Lt2v883TsKAo58cg1tGdCX6Co/d?= =?us-ascii?Q?mvc7LT/zaGxvM2eV5JfxjdPcbfBlD2aUP7c1GG9ZPZHnChV9oKtGHU1nk9x+?= =?us-ascii?Q?XeOTr2Platfl4hDwoR9goDP+7bBlZXF8hQk23Zg8N3MI9hUZGpa5mAcNbOk8?= =?us-ascii?Q?Dc6L9NJqMu+xpRA8RQR1nkhPHdppTgjFz8QGaHzVPIUMbYk5g+EYZzwLSqP3?= =?us-ascii?Q?KLxRRtRSJ85ga8MCuUiOHks+zMQa4GOxNKmS16qeEIUwCYC0tOIWS2oTVY88?= =?us-ascii?Q?gDIqZ0m2Qaku++wlFA0JbE/Bd7hmJfkpJCvbCeEwKULyR1BncyEfIiS3tp/V?= =?us-ascii?Q?Wz5tB3BuF63FXNvixNBTzJAkcfV14ufwHLPmstlprPMWqYBcOrHxXm6yTT1i?= =?us-ascii?Q?jwK0me9J6HLrnxAufWHRHBtaIN/RhLdfhGRtFVN7q/9qyJiuNaggC00Z2BrO?= =?us-ascii?Q?DnNOYOrM8V+wZ9xMIDMFOz+mignvS4Y/W/4//5eZZMbizVmK7YyXNh64aQ1+?= =?us-ascii?Q?LhCeLcTU9y8ZDDqrmp3GOjGII+5r/g5Cde2nI/QbXskbRf4KN6u8YTeV78sy?= =?us-ascii?Q?1Ea4VeKKYEvPQykOGy1aRYPr7GB49mM237/Y7Nq+NkSvaTlIGbIFUqVl358G?= =?us-ascii?Q?isx+eJ1GWziYQqV/lf2VJlZeHLIdtcxbiYORJBBUWh/Movf291MMdjLFrtjB?= =?us-ascii?Q?UTgfE0nJxgpu7WFOCga9lk2h/6V6WrQqQwQwIoPEUCQC31pCo+q28hX6+ZGA?= =?us-ascii?Q?SJ3kI38EOw=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: ea4b0c7e-979f-4cf3-dafe-08debdf8fa83 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:19.0900 (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: G5QZBf9gc1WgTkXpk1SapbxzEAo/2sR3ReTEAVqqrnNRqF40PKf1Dy/BCanuWSn4v/IVA1E9AwtMAKcE3CrczA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" The FSP Chain of Trust handshake is versioned, and the version the driver must advertise depends on the GPU: Hopper speaks version 1 and Blackwell speaks version 2. Represent that version explicitly and select it per architecture so the boot message carries the value FSP expects. Signed-off-by: John Hubbard --- drivers/gpu/nova-core/fsp.rs | 19 +++++++++++++++++++ drivers/gpu/nova-core/gpu.rs | 16 ++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/drivers/gpu/nova-core/fsp.rs b/drivers/gpu/nova-core/fsp.rs index cc2ebc3f6e78..5aae8282f2f0 100644 --- a/drivers/gpu/nova-core/fsp.rs +++ b/drivers/gpu/nova-core/fsp.rs @@ -36,6 +36,25 @@ =20 mod hal; =20 +/// FSP Chain of Trust protocol version. +/// +/// Hopper (GH100) uses version 1, Blackwell uses version 2. +#[derive(Debug, Clone, Copy)] +pub(crate) struct FspCotVersion(u16); + +impl FspCotVersion { + /// Creates a new FSP CoT version. + pub(crate) const fn new(version: u16) -> Self { + Self(version) + } + + /// Returns the raw protocol version number for the wire format. + #[expect(dead_code)] + pub(crate) const fn raw(self) -> u16 { + self.0 + } +} + /// FSP message timeout in milliseconds. const FSP_MSG_TIMEOUT_MS: i64 =3D 2000; =20 diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 7dd736e5b190..6cdface3c618 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -21,6 +21,7 @@ Falcon, // }, fb::SysmemFlush, + fsp::FspCotVersion, gsp::{ self, Gsp, // @@ -141,6 +142,21 @@ pub(crate) const fn needs_fwsec_bootloader(self) -> bo= ol { pub(crate) fn pci_config_mirror_range(self) -> Range { hal::gpu_hal(self).pci_config_mirror_range() } + + /// Returns the FSP Chain of Trust (CoT) protocol version for this chi= pset. + /// + /// Hopper (GH100) uses version 1, Blackwell uses version 2. + /// Returns `None` for architectures that do not use FSP. + #[expect(dead_code)] + pub(crate) const fn fsp_cot_version(self) -> Option { + match self.arch() { + Architecture::Hopper =3D> Some(FspCotVersion::new(1)), + Architecture::BlackwellGB10x | Architecture::BlackwellGB20x = =3D> { + Some(FspCotVersion::new(2)) + } + _ =3D> None, + } + } } =20 // TODO --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 95481345751; Sat, 30 May 2026 03:10:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110643; cv=fail; b=GUq4YRpNRPFfKol5Jw2RcYWd/3BG2jUCS2e9ts0fH8e1aBkHuskNUjLWrB/HWybqOmKP2VaYq2xYvSzb74LDovvKl4BHYpy4CFGLbSpfMaY8CU68BFqyoimERCZBmzO1CidbJ/bWc3fwB6+dn0pfpgFKce2A91MxIdIK/So+E80= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110643; c=relaxed/simple; bh=xRD2J0c8kADKC9v/KuDZjt+7pwVLKpPgqy36/5CACK8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=KbAioWR+/gf6g5XG84pa+ExpM6RP/3HkYsfZUD91ljrwn/X/HkM8lYxJErrihCIOmEetAnzcZTSc8Mgxy2QrAxkM/C/FNrFqR/AclwcCYuwWyaqT5kR/iF06PCBvtpaGRG7OysVhhOgH17wmONRqXSG+HwwTOctxjl25re/jdEo= 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=tZGYJkFs; arc=fail smtp.client-ip=40.93.201.22 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="tZGYJkFs" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=u7CDyLVHJu6nXK9b5mFdGiocex8c4SGdyg2fG5kpW5YI00y6mq2oFe3GEq85Xzv02s8+zwpIDggdtdxajjFVjiTDAx2mFdfFfNuvVR1PjDxN0y035aFHCZhjPD+H5hF6EFB7GIYpssSHUYRUrZZOOv4cpC79hQpzicrbTVW5npfD3i1GuVLjNbvF1UHzmweMcvUy7i0CgwDY/SOTAO3xewYdjZFLDGBRwgS6q+DgYCQLno1kV9CMI5CYzWNKYm5AhknBesndnjLPScAP9nwk054m/KZbzJNmaOthvC7hRosYE2jDVDTHr1y7vqV99yQHsyYD0KPzB+AoivdAJohEZw== 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=t6geEGkg3mU+VRlgAUnd08iiw3J0mJ/E6FBEpzFZUt0=; b=FzEH3oGxuaz139nMqHOb59Ca17SOQaiEzWZWUt8wM2OCpdZxDTPmvoKBTiSIOfU6R0aHtFoLc8l/PYgwgZVi3YYEJHXYmE1PzsPSFNMeJrmzhb6DNb/SonS6f8Gn5mdtdFfmTYRiBiYDRynVN8MkPpdyNDiswpL5oMoDcVPv1ymbhMHZ/USiV3eUOXUWID1Sz+n1sHp/J1ih5rnl+EF0acb3fTRYf/9T4RE0iSTOFnv7DDPjr7trfXN2zRjXyJUM+L7Ax5JQZ5RwonNuZdPnIg+l5QcvU5DSvPN7zDGiKtcvHmWA2AvCTyQGaSnD3cP8oR9n1icLyql2WFOaW2ITNw== 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=t6geEGkg3mU+VRlgAUnd08iiw3J0mJ/E6FBEpzFZUt0=; b=tZGYJkFsuZMDb7v4Ip+SZEIkRUKlkGhanjGp3NxASXWOGuOV45edE+v7+q86lIYY+26LdDzk0AY2kudW8tmf8htJ0GMkc0o+5gbiAPdjPTAhugmXYa8tB+/HJrsR+ozLZilc9xZrTiEOJDYPBNkiTZtDCTaz0k+RHme0anrh6jFuYcqmUmQ2ogBO04jJ34j1ibrjys4n6miaOL1xy21YRDADBgM8vC6qktdVk6hdCc0KIVnl6kDMSvaphpZB+raqOuePqTF7ufPBFGqFEITZN46d6MQD2wUsIpmPF3tEC3ZKRaHr2mu6XHMn3iKyhBxJJ6YRdlgZfYmrA/KYqC1z9A== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:21 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:20 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 19/22] gpu: nova-core: Hopper/Blackwell: add FSP Chain of Trust boot Date: Fri, 29 May 2026 20:09:50 -0700 Message-ID: <20260530030953.740561-20-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY3PR05CA0021.namprd05.prod.outlook.com (2603:10b6:a03:254::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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: 0f146464-7ea4-4e6f-774f-08debdf8fbb4 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|3023799007|6133799003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: SIgv+iqfE0oyABGJcOo0EhFEPIRoVvPIgOmEUd9xt9UgBDrzlfSS7NDE7sdJLLBPvT8ZBu1txAFEhRObzFB/4zAedOb7/M8ezQki4urOKygg9KBQ1Qj5W2d6sfDW5lIR1ijFP4ntHmUI5jHdLNz4cl/bnsM4ttxOjPLzzkqesVo3aAV2UltDRbMkPN2BW3Sjg4kVwPEV9gBgP5qs69xRuMYA9FHjY8Soyf6WMFP6V6BezvgR2WQFy+v/iUprG28QzAOmfB/+MgbZ/ffAwzKAhYrRmuFVFlsJRn8Oswu2gkSQ00sM3mmqRPv+jwl4zTCnydDUq2BIZXVF1XLDZagQknNVyEZHnbtDsTnEkk8vkQ2lY8oyd/0/qKcuokbjKNiYeJgiedhhVMCw46lU3LWPwibpoMMUH3oXmQG+uYLfap4Iwr6jnAffE7V4eaYBm/O6pVxMExPCAK/bVUqBtMMTHRwrStgMjQMui2pnPnWZ9KPYLXYq0urOt4oxS0Xb/e5r8ViBnsQcGnkjJdFKdCWpLaFY+xL1Chc3qvewZM9w9S+0tk6uze2Q4xV0GFGbk0vbM4chF7yMfW5C0Zp2HqHZ20AeqtNVLc1k2gqmrzagu5vNrUtiedJCn+jgzjVqMyM1l2Pp5drNJWWrIYZOriVJXcOZWSYzu1QBQ2TiiKz1dDoVQvp/9qjqJRcV9JJPYOIX 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)(366016)(376014)(7416014)(1800799024)(3023799007)(6133799003)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?+X/446HkOBpePF0QwDj97q/RdH8S+M35fpQvfhRUMbSzfoBiiGU+jGHqCqwO?= =?us-ascii?Q?1BiBkzeRoFMnI1MqoyYgsdhsa1La8o2qt1jeP7JmzAx3s7asShI4QXeOJTgA?= =?us-ascii?Q?ae+QL2quCuvPPyn8CL8Eju5DbdZNehlnfsOvm/8CSaE74PtJ6BRfPNI/tqbz?= =?us-ascii?Q?EhWCb/kZpay4LUUEGPvsGyRAWDC0y6t/KZPBBGRGQsfGVSRIG5v+pIxfWBKi?= =?us-ascii?Q?UF/H2YSLKXNERdC+D4FbmrTpJYAgLF7pdaEUeRKNqaCcR97I0/ZM6eAYV5J+?= =?us-ascii?Q?ItJXY+ZGnlipgq1eSxjo7oJhGUQ4o0UIgpxUQRcvYbtYlg+6JLLly+9meFme?= =?us-ascii?Q?Jv0iz+SQktbbzZaHsRVEY0R0a9CpqVOJxJ04icHVEdxwhV8COhmRzGa/Wuz5?= =?us-ascii?Q?y4MV3h2aRqDZEDbf6NwpFl09GElmen/337ZCA+9/kgNfEJiYjpThufQe5P3c?= =?us-ascii?Q?uh8VyN0HDkJXXKj+zpJj499ARCIAajrlG/UjnX6CrMKhoJKRVslL9ZFgHHp3?= =?us-ascii?Q?OidXVdQBCXFWWz6g7UcYBZMO0BALPg/n+n82YE/bljtTyzOvasrknXFuLpCz?= =?us-ascii?Q?LASHK+3GdcV8xe3+/QmnB4CFjtGpPh0jmOsvYjvGeCTIx//0ozO5Twze1iah?= =?us-ascii?Q?AkvbJR2s0sl7J6uYY4ksCsbIHxLOZ2xn/KeKXC+9CDpzB6Y/hGf9HPfS/54/?= =?us-ascii?Q?mkUU3nJMXTGSxVDXK/ZTvKVDhDwgInaeGlgaPSvfY2LPLCtvM9NsIss4V9Dm?= =?us-ascii?Q?mP2kPHQy9HZVEyDVe9J0zimCQXJAyJroBco+fxYu07gQWe63V7PqpzHP8f+a?= =?us-ascii?Q?mPqohwomDl85N9qAtp1agYfs6+dxvhmJHEv3/yfOBA/V8cg/jnlrcg/6v8qx?= =?us-ascii?Q?xumzXAd5x+gAFplo4elXv+jjiviTHIROP7ZWFx3Mx9azxV5sCwWCSSCQOg2X?= =?us-ascii?Q?fsKN1h4RDK+WpYgyZAMlbjzM376NwmY9+cL8njojReFXT3z4+Vsmj1YIs7nY?= =?us-ascii?Q?tzKojt42JIS0epmAM2JumykbsCAyO/tueuNQnix7SfExFiccNhQEvG9s4ncP?= =?us-ascii?Q?My4h00KTPg5sB2CcR5moK5Uws7P96e0kgCrlkyhnVJsEcmOs9+GfN1iakA/h?= =?us-ascii?Q?RkFkypGixcw1PKvANNoaXfjSJe8T4kDMkw3ToARDWYrR2kPVlOOLSbwmiedO?= =?us-ascii?Q?hTHjgBeSLJqX6Cal8qSOLSW9CI4GUMxcVwzguLlukyCxByt6isRJFmRiFmWE?= =?us-ascii?Q?syK4Ju2H1FVSwI0f2mT44QcNKSU2et2m0ypZ4AVzkJFji88aCHJbXIIJK2AH?= =?us-ascii?Q?iYDYHkOT9FvjH7B2zR512Lv48MxQwoxbhuNpPQX6addgS6oCgN9umLDIgElK?= =?us-ascii?Q?P6iO081N9hvDp50nfVmt6aw2s/+szGErxq3hm8Pr31Eo1YFzSi5fWvFemxKI?= =?us-ascii?Q?PnzgG6CQqvm6O0pr1NB+7T/d/1o6qirvTlnCP+y8JTsVkjyI9L+jt5oRqKlO?= =?us-ascii?Q?IlezFIhtifE5LKmc5cqsFxMwSKU3lIgEfi1J8ahKEjYb7oCwWm7K99WcTqU7?= =?us-ascii?Q?MUVvBJs3rbfreoNMFyAKUVQ6qIxK9ohcpMZItXKxKOKjbHPErjHHFZQ7dyJT?= =?us-ascii?Q?GyhKSxTCYgObqBn/NGeX5WbO6D/orvzAwgYCHBuHuFJW2t4MHfrrPWOo49zg?= =?us-ascii?Q?8PaKwUY4ei3OuYxq7fGokYPW3WITIs7LOn78POfXNPaYxj15IlOufDA2MWDu?= =?us-ascii?Q?yX6t4s0FNg=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 0f146464-7ea4-4e6f-774f-08debdf8fbb4 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:20.7400 (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: VdVDhKglKZGaN7eN9946/NfJKnMhqGPMyz+cCe/iLcCUr+gFT0oiqSb//5dEoGmK68Uzoqvv+QV3lcH8ExOmew== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" Build and send the Chain of Trust message to FSP, bundling the DMA-coherent boot parameters that FSP reads at boot time. Co-developed-by: Alexandre Courbot Signed-off-by: Alexandre Courbot Signed-off-by: John Hubbard --- drivers/gpu/nova-core/firmware/fsp.rs | 2 - drivers/gpu/nova-core/fsp.rs | 142 +++++++++++++++++- drivers/gpu/nova-core/gpu.rs | 1 - drivers/gpu/nova-core/gsp.rs | 1 + drivers/gpu/nova-core/gsp/fw.rs | 64 ++++++++ .../gpu/nova-core/gsp/fw/r570_144/bindings.rs | 82 ++++++++++ drivers/gpu/nova-core/gsp/hal/gh100.rs | 26 +++- drivers/gpu/nova-core/mctp.rs | 2 - 8 files changed, 307 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/nova-core/firmware/fsp.rs b/drivers/gpu/nova-core/= firmware/fsp.rs index dc28d0cc2d03..13e6a5b5aeae 100644 --- a/drivers/gpu/nova-core/firmware/fsp.rs +++ b/drivers/gpu/nova-core/firmware/fsp.rs @@ -39,10 +39,8 @@ pub(crate) struct FmcSignatures { =20 pub(crate) struct FspFirmware { /// FMC firmware image data (only the "image" ELF section). - #[expect(dead_code)] pub(crate) fmc_image: Coherent<[u8]>, /// FMC firmware signatures. - #[expect(dead_code)] pub(crate) fmc_sigs: KBox, } =20 diff --git a/drivers/gpu/nova-core/fsp.rs b/drivers/gpu/nova-core/fsp.rs index 5aae8282f2f0..5878d86323b9 100644 --- a/drivers/gpu/nova-core/fsp.rs +++ b/drivers/gpu/nova-core/fsp.rs @@ -9,8 +9,14 @@ =20 use kernel::{ device, + dma::Coherent, io::poll::read_poll_timeout, prelude::*, + ptr::{ + Alignable, + Alignment, // + }, + sizes::SZ_2M, time::Delta, transmute::{ AsBytes, @@ -24,7 +30,13 @@ self, Falcon, // }, + fb::FbLayout, + firmware::fsp::{ + FmcSignatures, + FspFirmware, // + }, gpu::Chipset, + gsp::GspFmcBootParams, mctp::{ MctpHeader, NvdmHeader, @@ -49,7 +61,6 @@ pub(crate) const fn new(version: u16) -> Self { } =20 /// Returns the raw protocol version number for the wire format. - #[expect(dead_code)] pub(crate) const fn raw(self) -> u16 { self.0 } @@ -67,6 +78,35 @@ struct NvdmPayloadCommandResponse { error_code: u32, } =20 +/// NVDM (NVIDIA Device Management) CoT (Chain of Trust) payload, the main +/// message body sent to FSP for Chain of Trust boot. +#[repr(C, packed)] +#[derive(Clone, Copy)] +struct NvdmPayloadCot { + version: u16, + size: u16, + gsp_fmc_sysmem_offset: u64, + frts_sysmem_offset: u64, + frts_sysmem_size: u32, + frts_vidmem_offset: u64, + frts_vidmem_size: u32, + sigs: FmcSignatures, + gsp_boot_args_sysmem_offset: u64, +} + +/// Complete FSP message structure with MCTP and NVDM headers. +#[repr(C, packed)] +#[derive(Clone, Copy)] +struct FspMessage { + mctp_header: MctpHeader, + nvdm_header: NvdmHeader, + cot: NvdmPayloadCot, +} + +// SAFETY: `FspMessage` is `#[repr(C, packed)]` with no padding, so all of= its +// bytes are initialized. +unsafe impl AsBytes for FspMessage {} + /// Complete FSP response structure with MCTP and NVDM headers. #[repr(C, packed)] #[derive(Clone, Copy)] @@ -88,6 +128,47 @@ pub(crate) trait MessageToFsp: AsBytes { const NVDM_TYPE: u32; } =20 +impl MessageToFsp for FspMessage { + const NVDM_TYPE: u32 =3D NvdmType::Cot as u32; +} + +/// Bundled arguments for FMC boot via FSP Chain of Trust. +pub(crate) struct FmcBootArgs<'a> { + chipset: Chipset, + fsp_fw: &'a FspFirmware, + fmc_boot_params: Coherent, + resume: bool, +} + +impl<'a> FmcBootArgs<'a> { + /// Builds FMC boot arguments, allocating the DMA-coherent boot parame= ter + /// structure that FSP will read. + pub(crate) fn new( + dev: &device::Device, + chipset: Chipset, + fsp_fw: &'a FspFirmware, + wpr_meta_addr: u64, + libos_addr: u64, + resume: bool, + ) -> Result { + let init =3D GspFmcBootParams::new(wpr_meta_addr, libos_addr); + + Ok(Self { + chipset, + fsp_fw, + fmc_boot_params: Coherent::::init(dev, GFP_K= ERNEL, init)?, + resume, + }) + } + + /// DMA address of the FMC boot parameters, needed after boot for lock= down + /// release polling. + #[expect(dead_code)] + pub(crate) fn boot_params_dma_handle(&self) -> u64 { + self.fmc_boot_params.dma_handle() + } +} + /// FSP interface for Hopper/Blackwell GPUs. pub(crate) struct Fsp; =20 @@ -115,8 +196,65 @@ pub(crate) fn wait_secure_boot(dev: &device::Device, b= ar: &Bar0, chipset: Chipse .map(|_| ()) } =20 + /// Boots GSP FMC via FSP Chain of Trust. + /// + /// Builds the CoT message from the pre-configured [`FmcBootArgs`], se= nds it + /// to FSP, and waits for the response. + pub(crate) fn boot_fmc( + dev: &device::Device, + bar: &Bar0, + fb_layout: &FbLayout, + fsp_falcon: &mut Falcon, + args: &FmcBootArgs<'_>, + ) -> Result { + dev_dbg!(dev, "Starting FSP boot sequence for {}\n", args.chipset); + + let fmc_addr =3D args.fsp_fw.fmc_image.dma_handle(); + let fmc_boot_params_addr =3D args.fmc_boot_params.dma_handle(); + + // frts_offset is relative to FB end: FRTS_location =3D FB_END - f= rts_offset + let frts_offset =3D if !args.resume { + let frts_reserved_size =3D fb_layout.heap.len() + u64::from(fb= _layout.pmu_reserved_size); + + frts_reserved_size + .align_up(Alignment::new::()) + .ok_or(EINVAL)? + } else { + 0 + }; + let frts_size: u32 =3D if !args.resume { + fb_layout.frts.len().try_into()? + } else { + 0 + }; + + let msg =3D KBox::new( + FspMessage { + mctp_header: MctpHeader::single_packet(), + nvdm_header: NvdmHeader::new(NvdmType::Cot), + cot: NvdmPayloadCot { + version: args.chipset.fsp_cot_version().ok_or(ENOTSUPP= )?.raw(), + size: u16::try_from(core::mem::size_of::()) + .map_err(|_| EINVAL)?, + gsp_fmc_sysmem_offset: fmc_addr, + frts_sysmem_offset: 0, + frts_sysmem_size: 0, + frts_vidmem_offset: frts_offset, + frts_vidmem_size: frts_size, + sigs: *args.fsp_fw.fmc_sigs, + gsp_boot_args_sysmem_offset: fmc_boot_params_addr, + }, + }, + GFP_KERNEL, + )?; + + Self::send_sync_fsp(dev, bar, fsp_falcon, &*msg)?; + + dev_dbg!(dev, "FSP Chain of Trust completed successfully\n"); + Ok(()) + } + /// Sends a message to FSP and waits for the response. - #[expect(dead_code)] fn send_sync_fsp( dev: &device::Device, bar: &Bar0, diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 6cdface3c618..43749a62f593 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -147,7 +147,6 @@ pub(crate) fn pci_config_mirror_range(self) -> Range { /// /// Hopper (GH100) uses version 1, Blackwell uses version 2. /// Returns `None` for architectures that do not use FSP. - #[expect(dead_code)] pub(crate) const fn fsp_cot_version(self) -> Option { match self.arch() { Architecture::Hopper =3D> Some(FspCotVersion::new(1)), diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index 1885cfa5cb38..69175ca3315c 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -25,6 +25,7 @@ mod sequencer; =20 pub(crate) use fw::{ + GspFmcBootParams, GspFwWprMeta, LibosParams, // }; diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index 0c54e8bf4bb3..558b37863f00 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -934,3 +934,67 @@ fn new(cmdq: &Cmdq) -> impl Init + '_ { }) } } + +#[repr(u32)] +pub(crate) enum GspDmaTarget { + #[expect(dead_code)] + LocalFb =3D bindings::GSP_DMA_TARGET_GSP_DMA_TARGET_LOCAL_FB, + CoherentSystem =3D bindings::GSP_DMA_TARGET_GSP_DMA_TARGET_COHERENT_SY= STEM, + NoncoherentSystem =3D bindings::GSP_DMA_TARGET_GSP_DMA_TARGET_NONCOHER= ENT_SYSTEM, +} + +type GspAcrBootGspRmParams =3D bindings::GSP_ACR_BOOT_GSP_RM_PARAMS; + +impl GspAcrBootGspRmParams { + fn new(target: GspDmaTarget, wpr_meta_addr: u64) -> impl Init { + #[allow(non_snake_case)] + let params =3D init!(Self { + target: target as u32, + gspRmDescSize: num::usize_into_u32::<{ size_of::= () }>(), + gspRmDescOffset: wpr_meta_addr, + bIsGspRmBoot: 1, + wprCarveoutOffset: 0, + wprCarveoutSize: 0, + __bindgen_padding_0: Default::default(), + }); + + params + } +} + +type GspRmParams =3D bindings::GSP_RM_PARAMS; + +impl GspRmParams { + fn new(target: GspDmaTarget, libos_addr: u64) -> impl Init { + #[allow(non_snake_case)] + let params =3D init!(Self { + target: target as u32, + bootArgsOffset: libos_addr, + __bindgen_padding_0: Default::default(), + }); + + params + } +} + +pub(crate) type GspFmcBootParams =3D bindings::GSP_FMC_BOOT_PARAMS; + +// SAFETY: Padding is explicit and will not contain uninitialized data. +unsafe impl AsBytes for GspFmcBootParams {} +// SAFETY: This struct only contains integer types for which all bit patte= rns are valid. +unsafe impl FromBytes for GspFmcBootParams {} + +impl GspFmcBootParams { + pub(crate) fn new(wpr_meta_addr: u64, libos_addr: u64) -> impl Init { + #[allow(non_snake_case)] + let init =3D init!(Self { + // Blackwell FSP obtains WPR info from other sources, so + // wprCarveoutOffset and wprCarveoutSize are left zero. + bootGspRmParams <- GspAcrBootGspRmParams::new(GspDmaTarget::Co= herentSystem, wpr_meta_addr), + gspRmParams <- GspRmParams::new(GspDmaTarget::NoncoherentSyste= m, libos_addr), + ..Zeroable::init_zeroed() + }); + + init + } +} diff --git a/drivers/gpu/nova-core/gsp/fw/r570_144/bindings.rs b/drivers/gp= u/nova-core/gsp/fw/r570_144/bindings.rs index 1d592bd3f9ed..ea350f9b2cc4 100644 --- a/drivers/gpu/nova-core/gsp/fw/r570_144/bindings.rs +++ b/drivers/gpu/nova-core/gsp/fw/r570_144/bindings.rs @@ -883,6 +883,88 @@ fn default() -> Self { } } } +pub const GSP_DMA_TARGET_GSP_DMA_TARGET_LOCAL_FB: GSP_DMA_TARGET =3D 0; +pub const GSP_DMA_TARGET_GSP_DMA_TARGET_COHERENT_SYSTEM: GSP_DMA_TARGET = =3D 1; +pub const GSP_DMA_TARGET_GSP_DMA_TARGET_NONCOHERENT_SYSTEM: GSP_DMA_TARGET= =3D 2; +pub const GSP_DMA_TARGET_GSP_DMA_TARGET_COUNT: GSP_DMA_TARGET =3D 3; +pub type GSP_DMA_TARGET =3D ffi::c_uint; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone, MaybeZeroable)] +pub struct GSP_FMC_INIT_PARAMS { + pub regkeys: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone, MaybeZeroable)] +pub struct GSP_ACR_BOOT_GSP_RM_PARAMS { + pub target: GSP_DMA_TARGET, + pub gspRmDescSize: u32_, + pub gspRmDescOffset: u64_, + pub wprCarveoutOffset: u64_, + pub wprCarveoutSize: u32_, + pub bIsGspRmBoot: u8_, + pub __bindgen_padding_0: [u8; 3usize], +} +impl Default for GSP_ACR_BOOT_GSP_RM_PARAMS { + fn default() -> Self { + let mut s =3D ::core::mem::MaybeUninit::::uninit(); + unsafe { + ::core::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone, MaybeZeroable)] +pub struct GSP_RM_PARAMS { + pub target: GSP_DMA_TARGET, + pub __bindgen_padding_0: [u8; 4usize], + pub bootArgsOffset: u64_, +} +impl Default for GSP_RM_PARAMS { + fn default() -> Self { + let mut s =3D ::core::mem::MaybeUninit::::uninit(); + unsafe { + ::core::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone, MaybeZeroable)] +pub struct GSP_SPDM_PARAMS { + pub target: GSP_DMA_TARGET, + pub __bindgen_padding_0: [u8; 4usize], + pub payloadBufferOffset: u64_, + pub payloadBufferSize: u32_, + pub __bindgen_padding_1: [u8; 4usize], +} +impl Default for GSP_SPDM_PARAMS { + fn default() -> Self { + let mut s =3D ::core::mem::MaybeUninit::::uninit(); + unsafe { + ::core::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} +#[repr(C)] +#[derive(Debug, Copy, Clone, MaybeZeroable)] +pub struct GSP_FMC_BOOT_PARAMS { + pub initParams: GSP_FMC_INIT_PARAMS, + pub __bindgen_padding_0: [u8; 4usize], + pub bootGspRmParams: GSP_ACR_BOOT_GSP_RM_PARAMS, + pub gspRmParams: GSP_RM_PARAMS, + pub gspSpdmParams: GSP_SPDM_PARAMS, +} +impl Default for GSP_FMC_BOOT_PARAMS { + fn default() -> Self { + let mut s =3D ::core::mem::MaybeUninit::::uninit(); + unsafe { + ::core::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} #[repr(C)] #[derive(Debug, Default, Copy, Clone, MaybeZeroable)] pub struct rpc_unloading_guest_driver_v1F_07 { diff --git a/drivers/gpu/nova-core/gsp/hal/gh100.rs b/drivers/gpu/nova-core= /gsp/hal/gh100.rs index 151df05e303b..946e88481d6f 100644 --- a/drivers/gpu/nova-core/gsp/hal/gh100.rs +++ b/drivers/gpu/nova-core/gsp/hal/gh100.rs @@ -21,7 +21,10 @@ fsp::FspFirmware, FIRMWARE_VERSION, // }, - fsp::Fsp, + fsp::{ + FmcBootArgs, + Fsp, // + }, gpu::Chipset, gsp::{ boot::BootUnloadGuard, @@ -40,20 +43,31 @@ impl GspHal for Gh100 { /// the GSP boot internally - no manual GSP reset/boot is needed. fn boot<'a>( &self, - _gsp: &'a Gsp, + gsp: &'a Gsp, dev: &'a device::Device, bar: &'a Bar0, chipset: Chipset, - _fb_layout: &FbLayout, - _wpr_meta: &Coherent, + fb_layout: &FbLayout, + wpr_meta: &Coherent, _gsp_falcon: &'a Falcon, _sec2_falcon: &'a Falcon, ) -> Result> { - let _fsp_falcon =3D Falcon::::new(dev, chipset)?; - let _fsp_fw =3D FspFirmware::new(dev, chipset, FIRMWARE_VERSION)?; + let mut fsp_falcon =3D Falcon::::new(dev, chipset)?; + let fsp_fw =3D FspFirmware::new(dev, chipset, FIRMWARE_VERSION)?; =20 Fsp::wait_secure_boot(dev, bar, chipset)?; =20 + let args =3D FmcBootArgs::new( + dev, + chipset, + &fsp_fw, + wpr_meta.dma_handle(), + gsp.libos.dma_handle(), + false, + )?; + + Fsp::boot_fmc(dev, bar, fb_layout, &mut fsp_falcon, &args)?; + Err(ENOTSUPP) } } diff --git a/drivers/gpu/nova-core/mctp.rs b/drivers/gpu/nova-core/mctp.rs index a13146dc0cca..be3e757d05a0 100644 --- a/drivers/gpu/nova-core/mctp.rs +++ b/drivers/gpu/nova-core/mctp.rs @@ -7,8 +7,6 @@ //! Device Management) messages between the kernel driver and GPU firmware //! processors such as FSP and GSP. =20 -#![expect(dead_code)] - use kernel::pci::Vendor; =20 /// NVDM message type identifiers carried over MCTP. --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 363D4357D11; Sat, 30 May 2026 03:10:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110645; cv=fail; b=PLpsB2MQ9QCc+FGZYxpqQt97MBgGl4n/vdQfrBd0rUUvXJQvTTge3z9aeV2O8prst+v9n70/yc0P70TgRsBUG7i7bs93bc4ZDwv4xN4v2iL14uOUdW+kEw5/8aRxa1LXtjIg3RZ1nnaYRdN+tqzf7vAcqWQLNDbNajWlqMAYfdc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110645; c=relaxed/simple; bh=XqVTUWxaq3lwIT4VyKa5hUzv56NLbyOjFbneeghd6wE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=Dgu4G0URA/a3zn00T8ez19I9v4P5dDaQucCWUMjFivfq062k+j8s41kh4jw1m0lf5iBPVMTBQpDDDCmLjhzzMvf+R82jFhko8YYkvxeJ0NboPnGkTYOGpLqY3I5t2AGyJ1fQdTtWWqmEjkEgp8b81UAZSNLoboJwjdkdddq1wqc= 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=twjhcRke; arc=fail smtp.client-ip=40.93.201.22 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="twjhcRke" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xL+krfvcgD+cjiaZbMbnzMdZVkOiJBYgARhXClz83JoSiOo4X20LLYK9ZZ+vmyqSM83U4ZCdyNcu9bZN3t2qqTy9FsRj3l+ziE3KE97haYoLz7Lifst6L1747ynti3uaAtoDXXWIjREHqXGB5SEed/PaQtBxwRaSLFzanpsd2M0ZAShNwl9wZpPiRSmPiPmYw25gbUegwwcBhQ2ikn06lA5j1gxbhRAiGaZx5GXMr//Q9u63AyPrhMtQ/1GQ7BaJbq36k/3pQDH+cngK2tgzplSjrEMPjjBHdbVpnW3HbVerp6TqVICVksn537o/4RjwWOCSjvCyyqNG4fBQQxPRRA== 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=1zQ0X+9wNIQ8oiE6sadnMQ8uCkR575148r7BhGaHtBc=; b=jAL793PyY2cmt4nH8bHOHDFpzKsWnGGQ080Inv8x7bwcu6+dgrVj7nMhvV0dPfxA3WHDBf4VPKexLdCIJQu5TSh0SnPIn07w04Wg6n9ASwWw1tRci2u280x5OuAPXz2PEKnHex18CZqOlhIc7mEsPvYmEdEDdAgNaUfRvYivPgS7QJOBAIgNdpEwM9xRNh2gd2vj/XYT5eOXm3jxyeX9kSdB+btkU8J8NcdHCZXOdoTD77b0tvb0y4ELLYtL3Lq5Jjqwu/pDB5PdhDCLq7dCeg9eyPkTECRca+ExpdyiJBLKFx8jC2GzHY0id8nCKkw3PJy/duj89+Vd76ucdnJuYg== 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=1zQ0X+9wNIQ8oiE6sadnMQ8uCkR575148r7BhGaHtBc=; b=twjhcRkeF0KLV5vokn6fkic0/hwwenTiOhigsP2YWgWKf9KX+uSRAzbeK4FJK2B1YBz+tCwSXSPC4+FK8NAZHh+8CjrGnmqMslaxq+aPIDSy5L6J180LEA+2cNbZlJdWCuhIVQ4TLQJp8bDr8dXVWohaJx93OK0zKC9pRtmvEK6u0bxaA7OHxcmUpn4/OWBhYK2c5XlFYHLqqXiNfCX1r4reoNcf3rk8lFdWqJfJmrRT6Z27mdsHJLXGCk/0HTCp9GDgTR3CDsJfhQrhaQXGeDGKhNXIdCDl6tzoiAsB/NgiyQa2mqvpg/Rl2r1Jzu2CmQVkmnV32MdtSsfGHjGVNg== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:22 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:22 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 20/22] gpu: nova-core: Hopper/Blackwell: add GSP lockdown release polling Date: Fri, 29 May 2026 20:09:51 -0700 Message-ID: <20260530030953.740561-21-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR03CA0227.namprd03.prod.outlook.com (2603:10b6:a03:39f::22) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: 172f651c-d8a2-4bcb-4804-08debdf8fc74 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|3023799007|6133799003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: LvXZnsMK+Y283Pxyc1HPl1HaRhT/dKex3p5VCwOP+tQCGxalsLOSFC8v4VWVc0F9xJ3dVJrEqeYLQWKYlrHJ4IVXyAUo189t4ZofghM5FtDBpb9xbiv0gz6Uj6hzgEKmL7u634283T6XTOpQH6L5VHU382a92MjxDDr2W+6K70G0fHjirgV2srrFJyPM2M8L5d3fOcSkJIxmypoZ+RHxoxBsh2gO7yFaQlXk1EnGHYCzcOZu74h6O5/UIloNUWAraADRt7kLHRV99Zt2Nnca/Ez/o0Z7BaQr2zgqxscEevl6AERfI8jIrhIYiDGLxJmNTLg3RpyWHu1RBY72rlfnE2PNifAbITp6ajwsj8STTXGg9KCFWuKcafpZK8zj/Re7f20hhC5vkDjovrIm28rNhKwxZJfgRQFqG3RC3XJe285z0JHwfi4zC1865BKxbZi/QFk89HbsIsVejEmQSaWQNo6TgObvrBIzaVi5TuilpZJqz709hemw8+v8dhqYG9Iy4ryadIfLuRVIaygw+zV4Y5q579GoNe3Tn5bAN5YpjI5hkMiu3r26lc70WW1tsRHElBGqXQUN3rVm6LpY9w3CtaCWGzLhFQobJFVY61Orq+Cua0+JsV1gfVap63Nhkqf8NBbZqlCoQRsQAue91+C/ZMMoz0QwikMjAF8d7DwB5NKCHmgiT5qph+ljzMiANeBg 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)(366016)(376014)(7416014)(1800799024)(3023799007)(6133799003)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?4p9bIXi97gHPCr0Bakynx/LaF0a9K7YcF/mzKYHCiOiRV7gJpA3WUfM9+ef1?= =?us-ascii?Q?Mv9ZMUD/PJxM2qD+/1bc5xJnHYUNfst+uW3AygJ3DrMhavK7bdNU56LgTLhS?= =?us-ascii?Q?lwdpYIhLSfRQWJ49fknw/RhxpaOWgRGLqNA8LT5U8ne4hbj1vyCTKqRCXbRr?= =?us-ascii?Q?E+kRBR0EOd5lwCweCzeAw+wlcFY16NOj6jzdGY2CWybGZXFGvTANYso8Dhsp?= =?us-ascii?Q?VL4AN1VSTpZghXyKbBMCizI9ezgaiysPxxNTgrEA8GvCrd1GVdpe/9Y/VymZ?= =?us-ascii?Q?GsgxQXVyl9P4U4IvPkditImTGWOmuqdcFT4kIgNsCQCddNzGPdaZb0oCBVj1?= =?us-ascii?Q?vo/SMrYjfG827zUB67ny3I5KEe9C3VM8+ppkvg9HGubS0tH2jLc+k3mDKpMx?= =?us-ascii?Q?3hxbZj/IsXx2ELYHzAN3PBqFjJyIRFVv1FesD3D019aIMrlUk3cjUfEu+SXe?= =?us-ascii?Q?IlYSq/7/EVIVA5VXagY3B+B7GUhxTIALHgQ0pvdoh74ansKcSwUmix/o40Tq?= =?us-ascii?Q?BOOwEa9MXARCEkJhNdaaskvQxDsR5lDRjCXN/++O6F3gcRMjnSQ9vZJxNvvv?= =?us-ascii?Q?CQXtUlVvRq0SymTIVkdkgg4XVHzjjc+gjw5ZzHMvQcHNkKx2PWF8PE5LAKiS?= =?us-ascii?Q?Oxk0gogzcoHE0y9DGnt2D+YeKaU5ktLODt3CZ8Ce1pzqoHLL7GawI7w73ZlP?= =?us-ascii?Q?VVT4v0wSmAyvmC0BakH+ZEi0tRGC6YALc35Nv6qQO3EZUQAvTueb+hk5EAa8?= =?us-ascii?Q?O0TG3V4UHIobIGZmvjLrKNTbpngVgnrJG9qEEMf23YQ/Qxi1rHnmS8A7ajb9?= =?us-ascii?Q?WPdPk9BR3JqxOWHdWh2MR9VKPHeTmeI9rNgtnMwW3CU+/vGAdeOzW/s8nq2H?= =?us-ascii?Q?ohOgt0rJXVDJtgoHCAzXQUhC89ZhU2sqLdgKxMTfPbkVKwXhpeytZIGlxXxI?= =?us-ascii?Q?EGjlVVoPtyzMQuurpW62z37SAku9EVMcAQpcF3jOshpeqcF4j9zw7xp3QIM0?= =?us-ascii?Q?zhTO7QC16mGNTdS5dP2obQ07h05oMI4Ru0h4IscIV7SD7DjkJd5hR9zmorbU?= =?us-ascii?Q?FJ1HAceaQba+jw5GTXNJWOztaKFwjHJoGwwPJueEwZfneBOvBZGMmDrhYL6Y?= =?us-ascii?Q?mM11MiOMCdKb+w4k7aTZad/rj4ffPYiqNmQtGMy8LIdHvMF34t0D6hC7og3k?= =?us-ascii?Q?ZWlQ4S5BPXEVFOrlQt1xvuUtvDw0KIAwtWnlqClPyRvVgDu+O5xx4IgSilRQ?= =?us-ascii?Q?pF9BIAVodjy+23jg9ARDTAOQg7Vs2CB89GAIkrCwQL+Yt25DjOEvwy5oAwIv?= =?us-ascii?Q?jToZizo1LP4I7VZ5uVwBsjUj/kye5jvWG6hLuLKXFRB8UU5Lrlcb9gG2cC9b?= =?us-ascii?Q?0hFa+1++XBL0u4tgCteL2+CKOHDA0jDP70mYGpaXjycYKgTUzkjc5Vc0J+DA?= =?us-ascii?Q?Uf7cy9MW8hJU8fQWC8kNcBR2r+qjVyLTmV3NU+224m3otC8kDgfGbnccG444?= =?us-ascii?Q?WgcwtDmXVXOKG18MhfwP9g6gVdO1Atg01glF6DvbKZMPYsrYiaaeVuyhCvZK?= =?us-ascii?Q?sNp550wZe8SrH5k5VzSFM0YI7uYCMeLbAUkWS1W/MYfxPM50HycmZ2ISd7Or?= =?us-ascii?Q?opFvlEwF3KUHaXYJxGsvGm9TMyFnboorSYprt781/fs5k5PqegjIXQv6lu3X?= =?us-ascii?Q?rDW6ncbY7Wk8LYsCAl5ArM8iUGZtnkb38LyUfSAFFxVaLubJ9PrzB0jueKAe?= =?us-ascii?Q?bk8HRMBFhQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 172f651c-d8a2-4bcb-4804-08debdf8fc74 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:21.9778 (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: FzUS39BS0O6nh4+++QVeS/qXBzPnUFVBf+YSrANIxB4xH56iQHoA4Y/ymnUfOyHklSd9+k6pCDg9SEq1JUg4Rw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" On Hopper and Blackwell, FSP boots GSP with hardware lockdown enabled. After FSP Chain of Trust completes, the driver must poll for lockdown release before proceeding with GSP initialization. Add the register bit and helper functions needed for this polling. Signed-off-by: John Hubbard --- drivers/gpu/nova-core/fsp.rs | 1 - drivers/gpu/nova-core/gsp/hal/gh100.rs | 90 +++++++++++++++++++++++++- drivers/gpu/nova-core/regs.rs | 2 + 3 files changed, 90 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/nova-core/fsp.rs b/drivers/gpu/nova-core/fsp.rs index 5878d86323b9..15d4b01c284a 100644 --- a/drivers/gpu/nova-core/fsp.rs +++ b/drivers/gpu/nova-core/fsp.rs @@ -163,7 +163,6 @@ pub(crate) fn new( =20 /// DMA address of the FMC boot parameters, needed after boot for lock= down /// release polling. - #[expect(dead_code)] pub(crate) fn boot_params_dma_handle(&self) -> u64 { self.fmc_boot_params.dma_handle() } diff --git a/drivers/gpu/nova-core/gsp/hal/gh100.rs b/drivers/gpu/nova-core= /gsp/hal/gh100.rs index 946e88481d6f..1f333a6f57a0 100644 --- a/drivers/gpu/nova-core/gsp/hal/gh100.rs +++ b/drivers/gpu/nova-core/gsp/hal/gh100.rs @@ -5,7 +5,13 @@ =20 use kernel::{ device, - dma::Coherent, // + dma::Coherent, + io::{ + poll::read_poll_timeout, + register::WithBase, + Io, // + }, + time::Delta, }; =20 use crate::{ @@ -32,8 +38,85 @@ Gsp, GspFwWprMeta, // }, + regs, }; =20 +/// GSP lockdown pattern written by firmware to mbox0 while RISC-V branch = privilege +/// lockdown is active. The low byte varies, the upper 24 bits are fixed. +const GSP_LOCKDOWN_PATTERN: u32 =3D 0xbadf_4100; +const GSP_LOCKDOWN_MASK: u32 =3D 0xffff_ff00; + +/// GSP falcon mailbox state, used to track lockdown release status. +struct GspMbox { + mbox0: u32, + mbox1: u32, +} + +impl GspMbox { + /// Reads both mailboxes from the GSP falcon. + fn read(gsp_falcon: &Falcon, bar: &Bar0) -> Self { + Self { + mbox0: gsp_falcon.read_mailbox0(bar), + mbox1: gsp_falcon.read_mailbox1(bar), + } + } + + /// Returns `true` if the lockdown pattern is present in `mbox0`. + fn is_locked_down(&self) -> bool { + (self.mbox0 & GSP_LOCKDOWN_MASK) =3D=3D GSP_LOCKDOWN_PATTERN + } + + /// Combines mailbox0 and mailbox1 into a 64-bit address. + fn combined_addr(&self) -> u64 { + (u64::from(self.mbox1) << 32) | u64::from(self.mbox0) + } + + /// Returns `true` if GSP lockdown has been released. + /// + /// Checks the lockdown pattern, validates the boot params address, + /// and verifies the `HWCFG2` lockdown bit is clear. + fn lockdown_released(&self, bar: &Bar0, fmc_boot_params_addr: u64) -> = bool { + if self.is_locked_down() { + return false; + } + + if self.mbox0 !=3D 0 && self.combined_addr() !=3D fmc_boot_params_= addr { + return true; + } + + let hwcfg2 =3D bar.read(regs::NV_PFALCON_FALCON_HWCFG2::of::()); + !hwcfg2.riscv_br_priv_lockdown() + } +} + +/// Waits for GSP lockdown to be released after FSP Chain of Trust. +fn wait_for_gsp_lockdown_release( + dev: &device::Device, + bar: &Bar0, + gsp_falcon: &Falcon, + fmc_boot_params_addr: u64, +) -> Result { + dev_dbg!(dev, "Waiting for GSP lockdown release\n"); + + let mbox =3D read_poll_timeout( + || Ok(GspMbox::read(gsp_falcon, bar)), + |mbox| mbox.lockdown_released(bar, fmc_boot_params_addr), + Delta::from_millis(10), + Delta::from_secs(30), + ) + .inspect_err(|_| { + dev_err!(dev, "GSP lockdown release timeout\n"); + })?; + + if mbox.mbox0 !=3D 0 { + dev_err!(dev, "GSP-FMC boot failed (mbox: {:#x})\n", mbox.mbox0); + return Err(EIO); + } + + dev_dbg!(dev, "GSP lockdown released\n"); + Ok(()) +} + struct Gh100; =20 impl GspHal for Gh100 { @@ -49,7 +132,7 @@ fn boot<'a>( chipset: Chipset, fb_layout: &FbLayout, wpr_meta: &Coherent, - _gsp_falcon: &'a Falcon, + gsp_falcon: &'a Falcon, _sec2_falcon: &'a Falcon, ) -> Result> { let mut fsp_falcon =3D Falcon::::new(dev, chipset)?; @@ -68,6 +151,9 @@ fn boot<'a>( =20 Fsp::boot_fmc(dev, bar, fb_layout, &mut fsp_falcon, &args)?; =20 + let fmc_boot_params_addr =3D args.boot_params_dma_handle(); + wait_for_gsp_lockdown_release(dev, bar, gsp_falcon, fmc_boot_param= s_addr)?; + Err(ENOTSUPP) } } diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index d4067efb8772..0f48e78eebe7 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -355,6 +355,8 @@ pub(crate) fn vga_workspace_addr(self) -> Option { pub(crate) NV_PFALCON_FALCON_HWCFG2(u32) @ PFalconBase + 0x000000f4 { /// Signal indicating that reset is completed (GA102+). 31:31 reset_ready =3D> bool; + /// RISC-V branch privilege lockdown bit. + 13:13 riscv_br_priv_lockdown =3D> bool; /// Set to 0 after memory scrubbing is completed. 12:12 mem_scrubbing =3D> bool; 10:10 riscv =3D> bool; --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 9F7FA348452; Sat, 30 May 2026 03:10:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110647; cv=fail; b=fcnRcFirJgmI9yDh9T/w8vkZNaAXBjCQpEeiZf650crpOeXvKPh1UQ1Kr8yRucl+OxNMmAzySQQQaYmamHkoAFFYDgxwibWAUyeOY6GYImEavbk5ppgwmu1+wfUDsIVCiWfz2dhlrlP5AZiyW0e7xS7u/AldMcSoOgFMDPZbXHo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110647; c=relaxed/simple; bh=fJjEKK47jydt1AHAJEEWjsXZHUmQ+NH61cZyKirAY24=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=MG9dMmdV54D9JIHkKX8enLtH++rwbFiVLdqd9eCPObtdxHkhgSX5VUQ15zL7Agnmfv7KVu8Arr0N6AM10E7aRrfQCyqWkoihJkNhEu8qyLJLkM18S6/h6MHtZh4o3b24eZhALzdI0um/g1tnBit7eagcgQVCZyplCo8WbM34vl4= 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=adMtMjJj; arc=fail smtp.client-ip=40.93.201.22 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="adMtMjJj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PupryYAHcnkkvYCKqYpZaZ8l2f+2WEuitohI6J/rn/mrz8/tapemQ7fyvmxEWnphEBkaqbxP9Ft4FMzd51eDtOlsHlMtRoC1bcg47qhdUy8S2n1a1a59aXj3fbVqpFI/UxvmOgqWHMq1PjRwzWbX3jG3mONnCreDsGbeXJisgBiLpoF6egZqNMA+7kEqkCByBk/TcDSUo+4zpQApeQUaITf4lO/P+qxJsW0iuk67EuSt7RaDnnCJdXZsUEhJfAFzTU/qRhvye2U7vbnlVbeEZfVFDaz6Cp7CiX0K0shsrLy9QFP9D3iMsvxni/AYRoC51f88bC83cPrkc29Ybiq9vg== 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=kWQ8MtIV3M6fmaSFVl7Xrau+MEq93XxCAWkuSUijVzM=; b=u9ZLaGXbBfzPIctpQOz4R1LeTmD1xyJ5aK7187dF+thIUN3gS0Wv+u3XoA30e0OgdyWcmDtxxXUIINTQbAmZPOjNDgbxN+xSVz0bMpK4SFbtVRq/ea6uVSb67RrIUoGkOo6GjJMH9sBYzr2ix5RkTxJB4GJvHe2BixUwx9T79jUS8Tg0RH/457Q01IYinuqxfJlqBI3ycqbaZLMk4IpxcSD6FF5nts1K84Rk+ltlrihzksk/FpyTpNScp9vSXp5OZNAJYa6rY83EAOPiK2t0UvDnR06v1O7qM4jqvSW7ZXQ5KII9kR3ONBDOMdTqo4Rm7rDE3WTEiEQclwNvWxFWZw== 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=kWQ8MtIV3M6fmaSFVl7Xrau+MEq93XxCAWkuSUijVzM=; b=adMtMjJj4ja7uSaNJxK7ircgzF2ZRX7lsT+EBC8K/vOoBTLjcNZ8zW6EeolK3qSBYBN9kJ0StV2MY7rqaNYkcTadnMptlHdlqBooCH3llLYhy4MDOPesY3xh65i3teo/tT+oBa5SYGkpFBY+vVN8J0XJj7izf5ePEZZUasYthzJs+WobBkQ73sgJlagsD6q1bZWk/GADUp6KDG7UyIDci6w2yoK1kuysUqUpr25Ajj0FnxMx9ex2QvEaFEaCiqy1qXSysweH9Km9t1HqgEizGIPF6UZN0KK6XSQ6lLMLgXmW2H8sOokUgyFpodnH33d/I9Af09icRdt0vXSuH616Vg== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:23 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:23 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 21/22] gpu: nova-core: add non-sec2 unload path Date: Fri, 29 May 2026 20:09:52 -0700 Message-ID: <20260530030953.740561-22-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: SJ0PR05CA0107.namprd05.prod.outlook.com (2603:10b6:a03:334::22) 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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: c6547289-9b4c-403b-6d0f-08debdf8fd59 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: aM3nDf3kwtE9ES6PhviAxpKnTpSCvU2vS+cGe0oe48g9+pY9RplbM142NdhoLzVnFCQ2w/+SlxQs5ClCgSu8WszbUdqwUiaJgFQ9kZe0PrxiBdEt8HEBAXp9HW/12FQ+YtVc5JPgdcuKlBO9UhozhjyoWRlV37gf4mUWjH4Gz9hYiXd3rDL5pNgYSziU7juJ70NM64adOfHgFkmFR4AW1HGphyDFIl3OP705VBTh91CzXe19twt3JBBGdaxBCtXosMAb7esRL/v6CCjVGxjWQoZ1L+1d/xD1WJfS+ruMSxJO0snpj67mGkCVCEJwdeqy/a2rD4qgwOAKovC+LYy9B6cPasTctt0/9ebZ13h8zDd3PM0yN8VZKo8LX0H+NExN6XrBTDZymMlDrT8EYSoxJsb9VMRzwoND0EG7zwCp3dXr4pmKqeF5UawzpWSzxdE5C0rEfeDct3cCkzGocq1avYH7zsGLolj2s+rkuMtu3e+ZLPPA7uajbPf51XepfIQYWgxB10HFgkdd2zjk/CBD8rmEbF+0groaQ6fnFWYqMQpKMLDyLVRIkLqSPNK1F4r52R9bTCGOkDzbkdPjJr5vzwMFg5tb5rP+988PernRxenOpMETt2JvtWaRxmLH2bZoz+0zry4D4Nim5wH39N2sbcgWRZfHfLxQ+Wj0/OHgyspQzF+hghuolra7JyKkBz4f 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)(366016)(376014)(7416014)(1800799024)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?R5s9aCE2Qme1ZVy/ulgqn9xRlrnja1BMwgCDAbqdC/GXNV+uvd/+308ohrO8?= =?us-ascii?Q?hHQ4H8Y/ySgdjVSmbK6itG8kQu4JE32HmXftPwCWC/KPzChCV//5BUUpuS2K?= =?us-ascii?Q?rITTUhOpTDFEHgSyhJ6nRKXUHCHMKnVEckJugzWTFN9/PKHTBhWfmvTJ4Bn5?= =?us-ascii?Q?Ypsz7XOU9+OXOD62Sx1BrcnWT1ZZB31Y1TvFhDi3zpXJ/aszWdgRMP9B1Hsm?= =?us-ascii?Q?OAnNfGMVIj5ctj7EnO5SL6UYPiX41P0CCBp3L7Z6bmkPD7a0TuVtfG+7WQxo?= =?us-ascii?Q?WPVsUZc6yckCXTIZknDhEvn+5gTIy0MW28njCf5F8z4br92v1hTFZl+PfrNp?= =?us-ascii?Q?yLsNMqzedg5tekIsQwhNaYm4KUPPwkYh37Dbf6UPwfglDv3zigvDoS4gTJrR?= =?us-ascii?Q?iakzDdRWX35OpY76wicBxzuSraTv6epGapXO/ncCKrSt/trsKAbaTpxC9O0B?= =?us-ascii?Q?vBdObiFWtDJmnOh4tL/9fR+P8l1swCSd106tnqzEYntFKC0iMjxjjdHOcpQ1?= =?us-ascii?Q?vugrw0UI25JPs8XZHLLGRZE+Zbepx3bBs3ejB7l8Hn5xFWDZbZph2xHGrHdO?= =?us-ascii?Q?u61y7VjpByFiqfBkN757LvLlKKYBTSJ8IZ2VNx+J0dU+Qci+fAkZrEXzjX6S?= =?us-ascii?Q?ODVQqtY+nROGh5sODEyDqz9SbwZWvK9NL6gyaIoOcmx0eJvWeCtnYBSIba//?= =?us-ascii?Q?FrA6Jmjplmgx3EqK+7EUHrNgmJbO3cfHssYIFuFeLQMBi0/JVHZ+77DhIrbG?= =?us-ascii?Q?r2ObRpx97+PRs0Ag8cLsGEGCkzwlcwWS8XIeWwJJsFXtpw4UTW4MgwNqER/Q?= =?us-ascii?Q?Sch+IFV+cZwTjPGJ6woc1/eUl3nJ8paJY/0aU7+Nbmr2Dz8q47hDUT90g9Bz?= =?us-ascii?Q?qpRRQ2Wb9znzQWy0kulbsLykh/AjZV7gR7bLvxZPu2WWkCMgkJz5CI2/Qr1Y?= =?us-ascii?Q?QPoqDx6kM5k9iFSUDI9gxQdpeHDnWCysdZG3owgJGHo2mImfCzWvxxvGZGq1?= =?us-ascii?Q?sGg0A3tzEOYGbJfs1Sm5cJwoXcUEUB7iu/nREdIAFGEeDlDzKudlWbOXlRFR?= =?us-ascii?Q?xoBoUr/YdQO7gsASvWd2YaW2FfN8TPtgX6ZxUtkN7oEWVWJNcriTEGXB7t7W?= =?us-ascii?Q?AfsrtdqECRLpjrs9aYgVmGEENGuu5L97nn1Bfn44TAE0sOytIYPzh9FQyVff?= =?us-ascii?Q?NCz68GqZJp8SItGQML+F4wdMhptvoChqHS1GbhWg9dF9SvWkkHw6CtWru+4z?= =?us-ascii?Q?lFO0zCcaW0HBa0tb7/CBA+lRqaVOmZaeUHBeqM+cvrbKgZlDI6KvIsyZa4KM?= =?us-ascii?Q?1mF9qjW3BobUFOIGAnpcYDxqwG0uqKDcBFJl0LEDSTnD30MfEAtQLUpuUqzo?= =?us-ascii?Q?KLDHR6buIfi2styYudRhIlcW+V6OeARglQZik12r0gqWqnih2OaHCOvkZ4mI?= =?us-ascii?Q?JNYKSxw2NJsb6fLzf5Gv4L0G9AOqBpQYQCh0FcPMrbgkeekOqcGPPN1Y+2K6?= =?us-ascii?Q?MX4Xonhe7qnSTOOLOqiIQRkrYoDqnLRoex34c0eCQ7uXqMAkEgmvnIRxBC8V?= =?us-ascii?Q?GVD8yu+gf3Uhesn2TRkSMLuG0VyS9bv+EVKhjtbWIzqE2XCdLgKZHFVIH0cn?= =?us-ascii?Q?7cvEw6GV+uad9oed9wV5IYJ8u74DOqYnZFo1zbMbCX42fG8+BVcLnoF1EJYJ?= =?us-ascii?Q?82dzdlLNQKIXKpEQiGwjyaMBGcHghPp4WIbkC8s5HnNa1RGJW9afmBlry62C?= =?us-ascii?Q?kA2WODSgAQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: c6547289-9b4c-403b-6d0f-08debdf8fd59 X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:23.4930 (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: Z0MhYzgcfIFTeF36DHe+lEO2vghoJaBD+zk8UdgFIEDjJoHHgoT/uAqk1KwkKhFSrKuvAPHQzwB1s3C1FCtX2A== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" From: Eliot Courtney For non-sec2 it is only required to wait for GSP falcon to halt. This is because GSP does the main work of unloading on GPUs not using sec2. Signed-off-by: Eliot Courtney [ jhubbard: use Result instead of Result<()> in the UnloadBundle impl ] Signed-off-by: John Hubbard --- drivers/gpu/nova-core/gsp/hal/gh100.rs | 37 ++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/hal/gh100.rs b/drivers/gpu/nova-core= /gsp/hal/gh100.rs index 1f333a6f57a0..0076ca00a771 100644 --- a/drivers/gpu/nova-core/gsp/hal/gh100.rs +++ b/drivers/gpu/nova-core/gsp/hal/gh100.rs @@ -34,7 +34,10 @@ gpu::Chipset, gsp::{ boot::BootUnloadGuard, - hal::GspHal, + hal::{ + GspHal, + UnloadBundle, // + }, Gsp, GspFwWprMeta, // }, @@ -117,6 +120,28 @@ fn wait_for_gsp_lockdown_release( Ok(()) } =20 +struct FspUnloadBundle; + +impl UnloadBundle for FspUnloadBundle { + fn run( + &self, + dev: &device::Device, + bar: &Bar0, + gsp_falcon: &Falcon, + _sec2_falcon: &Falcon, + ) -> Result { + // GSP falcon does most of the work of resetting, so just wait for= it to finish. + read_poll_timeout( + || Ok(gsp_falcon.is_riscv_active(bar)), + |&active| !active, + Delta::from_millis(10), + Delta::from_secs(5), + ) + .map(|_| ()) + .inspect_err(|_| dev_err!(dev, "GSP falcon failed to halt\n")) + } +} + struct Gh100; =20 impl GspHal for Gh100 { @@ -133,11 +158,19 @@ fn boot<'a>( fb_layout: &FbLayout, wpr_meta: &Coherent, gsp_falcon: &'a Falcon, - _sec2_falcon: &'a Falcon, + sec2_falcon: &'a Falcon, ) -> Result> { let mut fsp_falcon =3D Falcon::::new(dev, chipset)?; let fsp_fw =3D FspFirmware::new(dev, chipset, FIRMWARE_VERSION)?; =20 + let unload_bundle =3D crate::gsp::UnloadBundle( + KBox::new(FspUnloadBundle, GFP_KERNEL)? as KBox + ); + + // Wrap the unload bundle into a drop guard so it is automatically= run upon failure. + let _unload_guard =3D + BootUnloadGuard::new(gsp, dev, bar, gsp_falcon, sec2_falcon, S= ome(unload_bundle)); + Fsp::wait_secure_boot(dev, bar, chipset)?; =20 let args =3D FmcBootArgs::new( --=20 2.54.0 From nobody Mon Jun 8 09:49:06 2026 Received: from CY3PR05CU001.outbound.protection.outlook.com (mail-westcentralusazon11013022.outbound.protection.outlook.com [40.93.201.22]) (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 27AE7348883; Sat, 30 May 2026 03:10:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.201.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110646; cv=fail; b=I30iePodEEKvrTQuEuLiHKDwtwFRuP7h1eMZ0befJJWxNlrcUqo1QyzLxpla25UAy7RwFOXiw5qLWitPjjIwZ3Bvq1u9Iab8brYe9yELEKvr7j+J/74GnjCHbuC0163hfAEpaxjri6XZ4Rqc6mSZWT7Qmms+CxceGKB4u+WOlDE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1780110646; c=relaxed/simple; bh=9aTn6XYUU7vTgBKrnp3cUAQfmyuUQT786vjiC15hX0A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=XYD0CMu8E/oTqpSnqc1DB+qh7etl7UROhr9pNvBlPuLWToX9aOJHjjYr4iLylMd+R2TLdGqqinBogeLno109V5QC2Ca9VMBYA9NMMDr7LGOujKB6RDBwKzZg8irGQXjF+x60Q6UxEfK5asAw5wut4C9g3rsGtRtCatMrg+hvvB8= 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=G+m/Eaat; arc=fail smtp.client-ip=40.93.201.22 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="G+m/Eaat" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=lenPXrQTryvgkkVvMbHa3GTIz59hEW5RN4NnFlrCy0nvNyIiM9XggfwMrILcacSYuQqEZTgEWMN3mzGameMj88jLj6ebZ6BER+MT6WudmRw2KmGv9EXa5M1Dc3toNciwVjtdsMhvwOAAC/hSzIEQS21dd/2NTmMl1KyGnVcYkLXSm8LulBm80oR2C3GQ/8ZL2UIKcL40nIQ9/2sgGLoh4VIxITkH2i5CdnaUWCEn9Uu2T2xsJ2zuftOP78TX2R1aQTvfHtTGcBia4VKGO8NIztAnX5bP0VNBbECwCIKpJO0YWL7b8f1m03xthYe6VaOW33RLagy64UGvebYZs3V2Pg== 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=CEVId1HfqvX6wY6Mp3hH5iEInI501ZvgvEpfVfIkeUY=; b=s8DHBDBjo96vOUch9Op8boKrEt2I8Atkh0LWDCkRkgMuGmcvh+gDICr5/D8kjIEe4dmEYs4ldSPJ0kDbvMQsP8SKPyTcg5Hp0hbzJlu+TZHMd1d8TbfGmsLqWftu0N6Q8ALitDFIwD3TrkM9nvPhdhT+I5HMNxaEOq6NhmXAbUjho4s7dxDhKD2HDVLpKshrUSZ93s5ygZO0OZecGNgUlMhRsEpaHNSa3VMcVFGqkZfFgpapZjoqKbLp2rQ6MxHmmsQYNIsfIBzVYFdN7QQ1Z4OF8qdh3SE+c7xD7WwVJoJSAKhobK/Nphmj9ztdfZNkaEwu2fFNWy0zhXACztWHRw== 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=CEVId1HfqvX6wY6Mp3hH5iEInI501ZvgvEpfVfIkeUY=; b=G+m/EaatslV8vIIdaf4e1ufD/QDHP3K3Jye1ilt/3vXix0LWxxRoDnAinAux22Mo9BKUh6i6y2qv04gBJYGPz51YbrYhwL2Hf/23+u19uUG521a+KqpDDRw/wWnHGq3gHHdmF8XnslawjRa87b2Xm/bFHbh3mVo1cJgboFR2ZdKTc51SkcimU9kAikgj1dUQYTZcyJqZlZXxC0qQ0olSany1UPNa8JRZiMoD6Nnqy4N65TvmJIvZU+dLNSTa0zrysba5dQrfYY4Addp9WtZpKF7kmqjUNxcrOamCytVyKbDJZH4KUMto5uZVb1zIR5VFQ77DEjpKZY4gpCCG/RVdTg== 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 MW4PR12MB6850.namprd12.prod.outlook.com (2603:10b6:303:1ed::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.71.15; Sat, 30 May 2026 03:10:24 +0000 Received: from DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8]) by DM3PR12MB9416.namprd12.prod.outlook.com ([fe80::8cdd:504c:7d2a:59c8%5]) with mapi id 15.21.0071.014; Sat, 30 May 2026 03:10:24 +0000 From: John Hubbard To: Danilo Krummrich , Alexandre Courbot Cc: Joel Fernandes , Timur Tabi , Alistair Popple , Eliot Courtney , Shashank Sharma , 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 , rust-for-linux@vger.kernel.org, LKML , John Hubbard Subject: [PATCH v11 22/22] gpu: nova-core: gsp: enable FSP boot path Date: Fri, 29 May 2026 20:09:53 -0700 Message-ID: <20260530030953.740561-23-jhubbard@nvidia.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260530030953.740561-1-jhubbard@nvidia.com> References: <20260530030953.740561-1-jhubbard@nvidia.com> X-NVConfidentiality: public Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: BY3PR05CA0021.namprd05.prod.outlook.com (2603:10b6:a03:254::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_|MW4PR12MB6850:EE_ X-MS-Office365-Filtering-Correlation-Id: 9ddf5aa8-ecfb-4d03-f04b-08debdf8fe0f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|366016|376014|7416014|1800799024|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: z+FRx3NSL8DDLSTt/F/vh7Lsv19rg+zrdUOQo6kEq7X3QtcfYQDjt+7bO6g735kBzuJisAiE8xioQByvHv4xRd/uG6pqTq157qa5M8ezKvXX2H6UP/NX1hrJDjGJJs+QfY2YkeY1L3iCIrXaD+6SvHDRCmj/NNJxggd2X63aHAWIbcvBPwAlXaPVeKwnJpF3ZtVNznXJYbRH/7Opic/IssHSJockGHR426MXKcWOxiypJJQC260XvMZZD/J31g1FrTccCsq4qdmJlrCkZH5F4t9o2OOfrIyjaTyDKmgFMOZ/Twl61yNN/Zn6IINABn1qypq/2UbUZIFO+SfHkNwwKddFDcW5inH+UYnxyCWnKSnXqa4w6RhNcXhkFSwM+ocO8qA0tArxtU/FW5etqUCVxnpimZZnmxco62e8Wf8MTdTasFwqRcqlrl0GwXE8ZTAARhv6J51uFLlyOMXq/Bau9E9UoNf2SbQmkj9d8o2xGwZkmhWcoAbsfC2CuHcmhRPTdu0covkrkrB1/sZs7aJXlQtngA4D0Jb9Dh6gQuX5nTR6Wk92Q7ncjM/9tfR5YNXC/h5TZQlbLbwlW5uZ2CW6qV9d+rqbh5pfTVmwj+KVdJhurEyH929cQVHbj3DhAzYAW37GcVezbIJ2enktwKrOq9tnFzOAExTaS3C+dbIBjWSMYJpMQuowr9MUVEfXpmJ5 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)(366016)(376014)(7416014)(1800799024)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?gUp5NKCoKlwhbP4wz2wAFHwjuaB3Bsaywu2Ob1FeoS0mN0z8O8Hf7BVUwEH/?= =?us-ascii?Q?S0puBs95QWW98abMdjLwI7BEsCmXTfjIbyXEo89F9q1Fe1BCwz8GKmXfUpkz?= =?us-ascii?Q?YpSxr8snUPM9not3ykgfe9g5rp/DJ6WHrA8st8coybxwntnnh1mCG1RDEFME?= =?us-ascii?Q?ZhMY6aF9g73T12speo3bFqRGXUNwPdtLOV7qj4EVFrzQIEmtECqEjbYKNEK2?= =?us-ascii?Q?6HC7+elSu97uP6O3q7iRKOMwLRl8oB1rJttestfLV0/HBLMmuPkQMxkBMpyg?= =?us-ascii?Q?zR5LBcixlhqaGsgLM1rLzOnlxsNwhs7eFPpba/ui4osX1ISn03YAoiK4pDxH?= =?us-ascii?Q?IGESHjL6LJ2gmR2i355PrMuudCVDJRcXizjUKZ3n54SZI87U9a1lLJUkKS29?= =?us-ascii?Q?KZUoRDWNbxHS5Z/FE+BvknOkTutwqGwP1g/JZHxRT7oIflnGnCOXvDzQcFDt?= =?us-ascii?Q?sX93kaDxJytXOn+Nw2dhTLaTFq++QiRZNfm6Hat8B2g75P5zlhMLHUa4zH85?= =?us-ascii?Q?C2KyiHggY6wnRIebiTJLvupajTeFwxdkSlJi6UuRamj1YwOZ+ePyAdQ+CcS9?= =?us-ascii?Q?pCaA763gnaP1Ec5og3KT4twk8Wh/R5anvhkCA+GCasITlzHUuKgsp9Dl2BuH?= =?us-ascii?Q?vV26S/QP4NzFtu8tCFjf0qc+daEP2pxj1mX4SvDNyZRNp59knukM/hzvitcm?= =?us-ascii?Q?Maju3mNejyKinbfZ+y567dT8lbzkMRRv6X4TDp6i9Mu1wws1WpsT3sAdszS8?= =?us-ascii?Q?Ws4Y2DvayW+zWN65XT7+PQRAcjKz2cnmgyWMfUtBW09Bb7ESO8XBYY8g8GAM?= =?us-ascii?Q?hSIil8SMOnQKL7EAaib0GeaaMIrK/RiL/xBN94WTp5wLNSiEFednxv+PZmDV?= =?us-ascii?Q?gWcwqLzWxBx4xm39xnnvIDmXCnZ9RPqBnfhEoKVPTZx+EW/Eo4/3gyPLmwkT?= =?us-ascii?Q?ayoOkUhj5bAzwJsGLOWYfcXGeBZzDcEU8hTxgz9XautAZiB8QqZPk4S3irMr?= =?us-ascii?Q?O5mkfxVuTXQfr8Bcg9ujKC5XE7pRGDzfjXpUfCiXOlAJcI7IIAQImNyBM9/6?= =?us-ascii?Q?h4ILm49si6lU1/ivdPgLD5JjmP38bNzvoTMyGxyX+5a+IZUjXiBbWxPOTey4?= =?us-ascii?Q?sqBq0dbqAaQCpp2Naw9Ecx/fw4Ap7ZObv1cMKmyGuuoh2nmQcFool1/s5soS?= =?us-ascii?Q?4m9Imujlr4uXgeWtTCnAjsKj7xmEsW8f/aAtk6OW8hYI76NFLBpa4wrvCHa8?= =?us-ascii?Q?CNtF3H/yEUIx/nRgG6whQn9g3tip3Fu6TnF7o78MJG5hMVmp3YPalbxHkDr7?= =?us-ascii?Q?OMVXuK/bFs0AiKq6PjCdSRKg+1yinicXYD4AQ2wN+qv06IaVoKi5YBpgu362?= =?us-ascii?Q?i0yVFG2vUj6UJ/uuLE5hPpAjMDZLilPgaVjd5/OaxB9uLH+m9GePupqOcd2g?= =?us-ascii?Q?VVCI18+4pFcF8j+Ym7L4rt3BIngNBwIN0o8pYlPfcz2gfQAv4cy//W3Cp1hW?= =?us-ascii?Q?luqGPXdhwosUnV8bdK0lw57rgjgpwzi4ulfMQUs7/ho1Pg+/1qQCI2RrmbWV?= =?us-ascii?Q?9hwZFYocV35QiCD0Ptgz+mUtkqmnq7vhpfvYAsYVLX286R8ypAjE/iVDjyP9?= =?us-ascii?Q?JGJRr5f3uV7LlPv3ThXzQud4sFAVD7AB7QVNdH0ixxHSbGLksJ2XIBa8D6yH?= =?us-ascii?Q?A+0NqQNKZshZTjomf++M5JEJNNYUSC0pJf+Pu/XfvxXuc+X/dhQlIfyjzuDv?= =?us-ascii?Q?TWMpmxB5cA=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9ddf5aa8-ecfb-4d03-f04b-08debdf8fe0f X-MS-Exchange-CrossTenant-AuthSource: DM3PR12MB9416.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 30 May 2026 03:10:24.6564 (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: jdj6JhRxtN1wccC3MRpE6fnur+psD0hOEecN51exOqkflbbqQtQfvyK4Lr1c1E9oaRXRHiNPSOzog5wArgcSrA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB6850 Content-Type: text/plain; charset="utf-8" From: Alexandre Courbot Now that all the elements are in place, enable the FSP boot path so Hopper and Blackwell can boot. Signed-off-by: Alexandre Courbot Signed-off-by: John Hubbard --- drivers/gpu/nova-core/gsp/hal/gh100.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/hal/gh100.rs b/drivers/gpu/nova-core= /gsp/hal/gh100.rs index 0076ca00a771..c5434d59db0d 100644 --- a/drivers/gpu/nova-core/gsp/hal/gh100.rs +++ b/drivers/gpu/nova-core/gsp/hal/gh100.rs @@ -168,7 +168,7 @@ fn boot<'a>( ); =20 // Wrap the unload bundle into a drop guard so it is automatically= run upon failure. - let _unload_guard =3D + let unload_guard =3D BootUnloadGuard::new(gsp, dev, bar, gsp_falcon, sec2_falcon, S= ome(unload_bundle)); =20 Fsp::wait_secure_boot(dev, bar, chipset)?; @@ -187,7 +187,7 @@ fn boot<'a>( let fmc_boot_params_addr =3D args.boot_params_dma_handle(); wait_for_gsp_lockdown_release(dev, bar, gsp_falcon, fmc_boot_param= s_addr)?; =20 - Err(ENOTSUPP) + Ok(unload_guard) } } =20 --=20 2.54.0