From nobody Thu Apr 2 19:00:05 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013050.outbound.protection.outlook.com [40.107.201.50]) (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 BE29F33B967; Fri, 6 Mar 2026 04:52:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.50 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772777; cv=fail; b=AqRTh9FkYzUset5HlwhyHNDrak9nCIIfpZE5pN/Oj+Wd+S8/tjFiUdYMZfxZDNc/E9Ux6cz0bMi4EZGcAlXtN1Dq40sMcZEpw4LSS+7I9giuc0UCRAqo7Y7/WktL2Tu8usfIxnYZOPoUsNpMwUktN5tkVs3YOt02AOK9BtgBFJ0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772777; c=relaxed/simple; bh=Jfqn8xOV3MrStYG6u8+VTJBY4sCW3Guk++L5xDXhHn8=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=ZnLUJR1r2sJJAqisdhupE7tRBfyNPM7ucQjYNXRThB29ZrMMjoomzn1A3OKlQuDhv09Nt/AkpFRldW2s2wJtwSWGF5mqK/Yzl4vQvQ5nRC5UQccLycWhsoH8BcCRPhHuZErTxhJ5WYAC1sBWjrFAalaMSl+3GTKxRuzvYGpYsus= 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=p/7+p5F5; arc=fail smtp.client-ip=40.107.201.50 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="p/7+p5F5" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=oD216Ksi/ydSRQJx9qA2rQbIi3BHRtB+ZnriCOeY5Gh2KkxSkJ8kOGXey/87sf+muWkbmXiHMOq69c0OM7FfwQasIwnygLyTCFmNfzwkM3IzYd6crj2KPIaIMYT8ptDmG0oR1elz5Z9tnB8JvbsdN2tZCrmr+2Saej08PdarUIBqEE6zI2mVoJPvCp81dQBchp1HEDK6pDp05vwidY2kHdoesNKeo8yMNY9pDR5wgDeF4LvyLsSQMJxC7bHzgnBLW9iR5bHAhs7/4EB7GKbs70/hSmQRyCZD8HxescXHoJxi8UYWoV3HMCq51UjOQ6mttUklOtjp22wELggxiQdcYw== 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=y7ZijNeUA9rdJ3I+ssKYz0LZTpWul8dTCbTRDhqSIMI=; b=kFn5wJV8wtryvQzb0DINBSzTVv7/yinZyWsXbIb3ucbOYMygI7tVJvUtHnTlTQbb6Axc753AKfZ/kDxE3rt6j8G4yKgw1B1lPFrtKVLffTw073IZ8bb0hiUFtyFqEh5QXQ7yZX/wrttE3om6lsXSPQrlcopezBoJsUiGHDLP7OfsLKUBtDykIyliHUb4rMRawkAXwDYeWFedCX297utU219U0xrBZ9eNdysL6a5qbAx95JX9jVrPDF7AYoYKtG2w/zFv7bo7HfAtvX9cTb3d18q3LCgpm4lzBJxtPEytBj7cccblV+YHSBBSuCWyXdGwk70PlO8q604i1AQ8MvHI0Q== 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=y7ZijNeUA9rdJ3I+ssKYz0LZTpWul8dTCbTRDhqSIMI=; b=p/7+p5F5/ftwS+exzLRixxm/78bnKAMiThpDIbzpg0KF4RFg8UeBnKHCYNXnNCyTW3AD883nwnb+7gDSz7L8NgBiWpmO2NFU64C42QSsz5W8HvtlfpurYXTlHZYEPF6CcsW5uGTApPu6aczyYI2CHxamkY93O4WhC4fbh71rtUnd8yl1GAlgW/jsISTM+xadX5OrJ6mHMswPwz8AU9G3sD2x3wJqfqnVmiwqg33e34V1N36T3T2ay6NgduzIQ8falTqIOZ/iPFhVT1NDFDuQCvnB52yaEA/80148YdMxbIOZkciaWUf3p/50z3zeM/fSSXZgTlv8mtIaEtpwHCVd4g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by BL3PR12MB6569.namprd12.prod.outlook.com (2603:10b6:208:38c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.5; Fri, 6 Mar 2026 04:52:50 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:52:50 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:38 +0900 Subject: [PATCH v11 01/12] gpu: nova-core: create falcon firmware DMA objects lazily Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-1-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYWP286CA0029.JPNP286.PROD.OUTLOOK.COM (2603:1096:400:262::17) To MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) 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: CH2PR12MB3990:EE_|BL3PR12MB6569:EE_ X-MS-Office365-Filtering-Correlation-Id: 874de52f-31c3-48e7-2daa-08de7b3c37b3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|10070799003|376014; X-Microsoft-Antispam-Message-Info: oy7z2vwMpLcYZj3vl+xjtgvtxtH6btARoI+8lRQwzLdsf6LaXucknTKwDgT5TgiaLHDqByW6Jh+dDAvq4kXIa5aD+17mc1qJXGQDOB66kamBNQ+42dEem8xtGb178mDrQ7u2/WDhSLSid+NxEUZIH5Hst1B459hDXm1lq8PXa/45gk15Xqmp/1qMiyYZW/tYSHXKQ2GqCVQJrB9rjTYdk+i4r4Z8fx4zShauajoz3pBmqC0sZVR/ojdaSNHgr4oqRtjf3to6pN0a+NjbnuW4Fc6nCX2qJOGBGLbw89KlT4si9YuN2fz0lqqGb9uiW5RRhGSIhOQY6TEo4CC1jXLvoJ48z7SY8X/CO/mEwficGANfcs0U+QqBnLKM4VR8uoE58HDCCu0IvuPghslVUWuzMF0eQ6dFTK5dBp3lJQAQpZDpPt4NdzLrObKfEEjVQhURuWFJPpbhFxptUY9UtHefFf3dkAm/DRQFmat5SVQS32/J1V0As682U+nTDXF8Lr6G5ceUdIi8eQaK5RwhrOeeRu4s+fjxwk3XHz2Yey3qV5to2px3PLfsckuAdwTuWQNBV7vDJfqp3KLO99h/84xsWdpp8bAVxO9xW4sYyf8X1WYUjj2Uas6uQH+HC4vBj4mFJQKXMCoOgM5k91UI2+VbbfP4UeBp37I7dBtBiB2yh+GRkC7qQx7+Oca/8vGbkaqLdX7BB0MQ3WKDccaLysbZRu7xcm+QtOiwFJNbyzuXRVU= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(10070799003)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?SGJuQ1RpUjBlQ3ByTVc1MTRNT3dDQmZINnJnMnRoQkJmTTcrWXBmWWFYdFhm?= =?utf-8?B?RXUwcGZjSmNrQnhlSGxKMGFmdGFGZllDcUI2K0EzU2hjcTFJTVZQZ3FzaDFa?= =?utf-8?B?N2xKcEhST0xZRGNhZ1RQSDF4OUNOQm00SlBha1cwYlFYNzVHelBNb3pYMHdQ?= =?utf-8?B?a09YUXp0WVJtZmI5Yk9UQmRQWjVmWUJUY1grb2htOWpiWnFIK1F4cDdCRE9a?= =?utf-8?B?VTB2RTgxK0x1NkNCV3k4NWJiUisvT2VSTVJYQjJtWVFwVVR5V0VRbm5JeHZj?= =?utf-8?B?dDYvUUZvZVlSNXlncFc2ck1JZExUWjBUK3U1UmFQZW5TU2tPVVE3bGJYRzh5?= =?utf-8?B?b3FlZnQ0cjZTNGtsNUVBUndsK25nR0FyYnFLS1JJaDFad3VVOHd4dHhjRXlK?= =?utf-8?B?cFZuZTgrZHFaTDlDR3ppazVuYnk3QlJCTzBPY05ONmVJRDhRK0pKdzhEeWdr?= =?utf-8?B?bWt3Q21rMnA3TTJtQ3BuUlR1eTc0dHNvUlFtbGtDZFFNTkdtYzU4WjNMOHVr?= =?utf-8?B?UGVpZld0aTBLWlZRd2tldHdUL0VQd3BCYUFGaU5UMFpoNHRUdGlrc0pRM09W?= =?utf-8?B?bHVVekthQ0xWMGJNcE5HUkFRdHkvZ2VzdGhGclI2MEdTMmdLeFhrQ0NoTGMv?= =?utf-8?B?ZGNBRHA1SFRteUxYMktVcEJFWDdMejN1Y1R1aTh0TnlDVlhRZzJ6V2wzR0dG?= =?utf-8?B?UUd0ZVVmMjgySG9iRnFDRjBoR3B5cW1OZisvKy9CYmx1ZGpoYW9LQ0ZHY0N2?= =?utf-8?B?NTZ6NEozNFV0bjBhSHkzZFlDcCswc2VINUVaNElFbzhWejRpQVVveUZFeU5E?= =?utf-8?B?dGdGdnNvek5hZEZ0MitiTlFrVm82c3RPN2VyYUIxQmY1Z0pnY2hNT0VYTUJC?= =?utf-8?B?N2JFV1BwYU81VmJGNFRYMG1Ic3pKRVQvOW54MEN3QzZOc0lFM3JxTHI3RmVB?= =?utf-8?B?UXJWVTJxWUkzWG9YOHNGeWZwL3JNRlBvcUpmWk9OaUZ4anJhdWd0MWhvb2VD?= =?utf-8?B?T3ZSdUpiVzkxV3ZhQ2lZd2poQ1NDb3FtUFlocnpSVjF1M0Rjd1B3dzR2emZE?= =?utf-8?B?ekg3RE1qQ0toQ2pRdzM1dVZFb3E5WUh2UmZsbHhyMzhqU3phWEx1QjVKRjBy?= =?utf-8?B?VkRyN2dCQkg2SDJlWVp2U3pjc21uNjJ4NDFNZTVVb2ZLNWovRU1mMU9NMnNH?= =?utf-8?B?QTVuYmF5SlBneC9qWjZsVkl2YzhNUnZhdHNqSy9SOU9mbkE1S3BGeThVMUdP?= =?utf-8?B?K1FHSjZ2N28rKys2TEJrekdkSEQ5Y2dmYkxjSVlUL2Z0bERMZkVWbHNSQ0No?= =?utf-8?B?MWlZaExLeCtxQlpLaFFYRWlpNkhKRkpBazBaNnRFZWF5WFlkS1k0L0JlVlJq?= =?utf-8?B?eXlobGhUd2NRd3V4ekNpNndyS2VnMkErbGNLMkJMWGNHOXdUUUpaUUdaMkFT?= =?utf-8?B?YkExSGpsMC80Zzd5KzllMnJYNmQwbUc3ZDREOVdiNVZlT1BRMGp6cXIvWVZ5?= =?utf-8?B?UVlDZHdHZEtVaDZQRVZXbmlLVGNXSGErWVA0QWtsTUJQSmJvVmhRQTE0RThv?= =?utf-8?B?V1RvSGFxR3hPMmtQVEhaaW5LSElLWmhhN0kwTHdBRHQzSGF2dmdpRVNibm52?= =?utf-8?B?b2tpelpCN3lxTnBjQ0N2TFBxT3ZCbGp2MUxoQ2xkYnBwN3RrSk96U0pZeE9X?= =?utf-8?B?c290ZVZNS01hNWVHUkRkZjhWVFo3SVdhZWFzSXgzTnV4aWtHTXJsKzlFQ21J?= =?utf-8?B?cWEvVjZiSHUwdDkrbi9yU0prSmNFV0RiaCt1VTE4TW53SS80MDByUFIrMVFT?= =?utf-8?B?UXNkVzlJcFB6Vm0yM3c5ZDdRYjE2UEhnZkRmRlZDRnpNVE52Y1hGUHJTdS9D?= =?utf-8?B?NHlZb0JoNzFzNVhXVjRRWHhncnlNblVhWVUzc1hjTktRcU10Y1FqRkNFczN1?= =?utf-8?B?azh4UENtMmh1TmtBcmxXd21RZ1VKY1YxdzEyWGp5OEVpdzRwSldRUHA0OGJM?= =?utf-8?B?bSt2NjRpNU5EUXhMbGhJay9pazdXSXl3dlFpUHQ3ZUthV1ZROTRHbm9ObnI2?= =?utf-8?B?NElBU0k1Qkxjclg1eGtYaEVOelZnZzJ2bnoram1DaEZ3SlN3RkQrdW5GSFlT?= =?utf-8?B?RTVzZm5COHcxc0FXUmVuVXRoemJYczFHUWZuWFBINGZJV1N1WktkZEtvRTlu?= =?utf-8?B?N2hBWTRGYmFXb2xPcnVSNytuVTU1L0lQR3JqOTlEZXloL1dIdWRob2NONXl5?= =?utf-8?B?VWRDNXNyVE9XcHA5Tlk5d3lPNk5ZQXd5N2t2WUJ0ejAvL3NKdmJLM0NXWjh1?= =?utf-8?B?ZG9JNWZ2WGZVZWxlVlcxb0RZRnVlZXBvVGtDajdXc3oraDQrVEhmcWJ6NXJR?= =?utf-8?Q?H1ZplQhTFmpcdaclri7tOs2zZATWNA4WxZoBPKmjweXmS?= X-MS-Exchange-AntiSpam-MessageData-1: /9bB8rFFm+1j4w== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 874de52f-31c3-48e7-2daa-08de7b3c37b3 X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3997.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:52:50.3924 (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: kCqnm/BuP24RppS5/oU5pSM8h/K/iAuf/21rIJw7dZB76tu64N/i4WyitpR51is/Ua/peI2Rr4vhxyEcdvMv6Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR12MB6569 When DMA was the only loading option for falcon firmwares, we decided to store them in DMA objects as soon as they were loaded from disk and patch them in-place to avoid having to do an extra copy. This decision complicates the PIO loading patch considerably, and actually does not even stand on its own when put into perspective with the fact that it requires 8 unsafe statements in the code that wouldn't exist if we stored the firmware into a `KVVec` and copied it into a DMA object at the last minute. The cost of the copy is, as can be expected, imperceptible at runtime. Thus, switch to a lazy DMA object creation model and simplify our code a bit. This will also have the nice side-effect of being more fit for PIO loading. Reviewed-by: Eliot Courtney Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/falcon.rs | 57 +++++++++++------ drivers/gpu/nova-core/firmware.rs | 38 ++++++------ drivers/gpu/nova-core/firmware/booter.rs | 33 +++++----- drivers/gpu/nova-core/firmware/fwsec.rs | 103 +++++++++++----------------= ---- drivers/gpu/nova-core/gsp/boot.rs | 2 +- 5 files changed, 106 insertions(+), 127 deletions(-) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 37bfee1d0949..8d444cf9d55c 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -2,12 +2,13 @@ =20 //! Falcon microprocessor base support =20 -use core::ops::Deref; - use hal::FalconHal; =20 use kernel::{ - device, + device::{ + self, + Device, // + }, dma::{ DmaAddress, DmaMask, // @@ -15,9 +16,7 @@ io::poll::read_poll_timeout, prelude::*, sync::aref::ARef, - time::{ - Delta, // - }, + time::Delta, }; =20 use crate::{ @@ -351,6 +350,9 @@ pub(crate) struct FalconBromParams { =20 /// Trait for providing load parameters of falcon firmwares. pub(crate) trait FalconLoadParams { + /// Returns the firmware data as a slice of bytes. + fn as_slice(&self) -> &[u8]; + /// Returns the load parameters for Secure `IMEM`. fn imem_sec_load_params(&self) -> FalconLoadTarget; =20 @@ -370,9 +372,8 @@ pub(crate) trait FalconLoadParams { =20 /// Trait for a falcon firmware. /// -/// A falcon firmware can be loaded on a given engine, and is presented in= the form of a DMA -/// object. -pub(crate) trait FalconFirmware: FalconLoadParams + Deref { +/// A falcon firmware can be loaded on a given engine. +pub(crate) trait FalconFirmware: FalconLoadParams { /// Engine on which this firmware is to be loaded. type Target: FalconEngine; } @@ -415,10 +416,10 @@ pub(crate) fn reset(&self, bar: &Bar0) -> Result { /// `target_mem`. /// /// `sec` is set if the loaded firmware is expected to run in secure m= ode. - fn dma_wr>( + fn dma_wr( &self, bar: &Bar0, - fw: &F, + dma_obj: &DmaObject, target_mem: FalconMem, load_offsets: FalconLoadTarget, ) -> Result { @@ -430,11 +431,11 @@ fn dma_wr>( // For DMEM we can fold the start offset into the DMA handle. let (src_start, dma_start) =3D match target_mem { FalconMem::ImemSecure | FalconMem::ImemNonSecure =3D> { - (load_offsets.src_start, fw.dma_handle()) + (load_offsets.src_start, dma_obj.dma_handle()) } FalconMem::Dmem =3D> ( 0, - fw.dma_handle_with_offset(load_offsets.src_start.into_safe= _cast())?, + dma_obj.dma_handle_with_offset(load_offsets.src_start.into= _safe_cast())?, ), }; if dma_start % DmaAddress::from(DMA_LEN) > 0 { @@ -466,7 +467,7 @@ fn dma_wr>( dev_err!(self.dev, "DMA transfer length overflow\n"); return Err(EOVERFLOW); } - Some(upper_bound) if usize::from_safe_cast(upper_bound) > fw.s= ize() =3D> { + Some(upper_bound) if usize::from_safe_cast(upper_bound) > dma_= obj.size() =3D> { dev_err!(self.dev, "DMA transfer goes beyond range of DMA = object\n"); return Err(EINVAL); } @@ -515,7 +516,12 @@ fn dma_wr>( } =20 /// Perform a DMA load into `IMEM` and `DMEM` of `fw`, and prepare the= falcon to run it. - fn dma_load>(&self, bar: &Bar0, fw: &F= ) -> Result { + fn dma_load>( + &self, + dev: &Device, + bar: &Bar0, + fw: &F, + ) -> Result { // The Non-Secure section only exists on firmware used by Turing a= nd GA100, and // those platforms do not use DMA. if fw.imem_ns_load_params().is_some() { @@ -523,14 +529,22 @@ fn dma_load>(&self, b= ar: &Bar0, fw: &F) -> Result return Err(EINVAL); } =20 + // Create DMA object with firmware content as the source of the DM= A engine. + let dma_obj =3D DmaObject::from_data(dev, fw.as_slice())?; + self.dma_reset(bar); regs::NV_PFALCON_FBIF_TRANSCFG::update(bar, &E::ID, 0, |v| { v.set_target(FalconFbifTarget::CoherentSysmem) .set_mem_type(FalconFbifMemType::Physical) }); =20 - self.dma_wr(bar, fw, FalconMem::ImemSecure, fw.imem_sec_load_param= s())?; - self.dma_wr(bar, fw, FalconMem::Dmem, fw.dmem_load_params())?; + self.dma_wr( + bar, + &dma_obj, + FalconMem::ImemSecure, + fw.imem_sec_load_params(), + )?; + self.dma_wr(bar, &dma_obj, FalconMem::Dmem, fw.dmem_load_params())= ?; =20 self.hal.program_brom(self, bar, &fw.brom_params())?; =20 @@ -641,9 +655,14 @@ pub(crate) fn is_riscv_active(&self, bar: &Bar0) -> bo= ol { } =20 // Load a firmware image into Falcon memory - pub(crate) fn load>(&self, bar: &Bar0,= fw: &F) -> Result { + pub(crate) fn load>( + &self, + dev: &Device, + bar: &Bar0, + fw: &F, + ) -> Result { match self.hal.load_method() { - LoadMethod::Dma =3D> self.dma_load(bar, fw), + LoadMethod::Dma =3D> self.dma_load(dev, bar, fw), LoadMethod::Pio =3D> Err(ENOTSUPP), } } diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index 815e8000bf81..09b12ad546c2 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -15,7 +15,6 @@ }; =20 use crate::{ - dma::DmaObject, falcon::{ FalconFirmware, FalconLoadTarget, // @@ -292,7 +291,7 @@ impl SignedState for Unsigned {} struct Signed; impl SignedState for Signed {} =20 -/// A [`DmaObject`] containing a specific microcode ready to be loaded int= o a falcon. +/// Microcode to be loaded into a specific falcon. /// /// This is module-local and meant for sub-modules to use internally. /// @@ -300,34 +299,33 @@ impl SignedState for Signed {} /// before it can be loaded (with an exception for development hardware). = The /// [`Self::patch_signature`] and [`Self::no_patch_signature`] methods are= used to transition the /// firmware to its [`Signed`] state. -struct FirmwareDmaObject(DmaObject, Pha= ntomData<(F, S)>); +struct FirmwareObject(KVVec, Phanto= mData<(F, S)>); =20 /// Trait for signatures to be patched directly into a given firmware. /// /// This is module-local and meant for sub-modules to use internally. trait FirmwareSignature: AsRef<[u8]> {} =20 -impl FirmwareDmaObject { - /// Patches the firmware at offset `sig_base_img` with `signature`. +impl FirmwareObject { + /// Patches the firmware at offset `signature_start` with `signature`. fn patch_signature>( mut self, signature: &S, - sig_base_img: usize, - ) -> Result> { + signature_start: usize, + ) -> Result> { let signature_bytes =3D signature.as_ref(); - if sig_base_img + signature_bytes.len() > self.0.size() { - return Err(EINVAL); - } + let signature_end =3D signature_start + .checked_add(signature_bytes.len()) + .ok_or(EOVERFLOW)?; + let dst =3D self + .0 + .get_mut(signature_start..signature_end) + .ok_or(EINVAL)?; =20 - // SAFETY: We are the only user of this object, so there cannot be= any race. - let dst =3D unsafe { self.0.start_ptr_mut().add(sig_base_img) }; + // PANIC: `dst` and `signature_bytes` have the same length. + dst.copy_from_slice(signature_bytes); =20 - // SAFETY: `signature` and `dst` are valid, properly aligned, and = do not overlap. - unsafe { - core::ptr::copy_nonoverlapping(signature_bytes.as_ptr(), dst, = signature_bytes.len()) - }; - - Ok(FirmwareDmaObject(self.0, PhantomData)) + Ok(FirmwareObject(self.0, PhantomData)) } =20 /// Mark the firmware as signed without patching it. @@ -335,8 +333,8 @@ fn patch_signature>( /// This method is used to explicitly confirm that we do not need to s= ign the firmware, while /// allowing us to continue as if it was. This is typically only neede= d for development /// hardware. - fn no_patch_signature(self) -> FirmwareDmaObject { - FirmwareDmaObject(self.0, PhantomData) + fn no_patch_signature(self) -> FirmwareObject { + FirmwareObject(self.0, PhantomData) } } =20 diff --git a/drivers/gpu/nova-core/firmware/booter.rs b/drivers/gpu/nova-co= re/firmware/booter.rs index ab374026b1f4..2b7166eaf283 100644 --- a/drivers/gpu/nova-core/firmware/booter.rs +++ b/drivers/gpu/nova-core/firmware/booter.rs @@ -4,10 +4,7 @@ //! running on [`Sec2`], that is used on Turing/Ampere to load the GSP fir= mware into the GSP falcon //! (and optionally unload it through a separate firmware image). =20 -use core::{ - marker::PhantomData, - ops::Deref, // -}; +use core::marker::PhantomData; =20 use kernel::{ device, @@ -16,7 +13,6 @@ }; =20 use crate::{ - dma::DmaObject, driver::Bar0, falcon::{ sec2::Sec2, @@ -28,7 +24,7 @@ }, firmware::{ BinFirmware, - FirmwareDmaObject, + FirmwareObject, FirmwareSignature, Signed, Unsigned, // @@ -269,12 +265,15 @@ pub(crate) struct BooterFirmware { // BROM falcon parameters. brom_params: FalconBromParams, // Device-mapped firmware image. - ucode: FirmwareDmaObject, + ucode: FirmwareObject, } =20 -impl FirmwareDmaObject { - fn new_booter(dev: &device::Device, data: &[u8]) -> Res= ult { - DmaObject::from_data(dev, data).map(|ucode| Self(ucode, PhantomDat= a)) +impl FirmwareObject { + fn new_booter(data: &[u8]) -> Result { + let mut ucode =3D KVVec::new(); + ucode.extend_from_slice(data, GFP_KERNEL)?; + + Ok(Self(ucode, PhantomData)) } } =20 @@ -328,7 +327,7 @@ pub(crate) fn new( let ucode =3D bin_fw .data() .ok_or(EINVAL) - .and_then(|data| FirmwareDmaObject::::new_booter(dev,= data))?; + .and_then(FirmwareObject::::new_booter)?; =20 let ucode_signed =3D { let mut signatures =3D hs_fw.signatures_iter()?.peekable(); @@ -400,6 +399,10 @@ pub(crate) fn new( } =20 impl FalconLoadParams for BooterFirmware { + fn as_slice(&self) -> &[u8] { + self.ucode.0.as_slice() + } + fn imem_sec_load_params(&self) -> FalconLoadTarget { self.imem_sec_load_target.clone() } @@ -425,14 +428,6 @@ fn boot_addr(&self) -> u32 { } } =20 -impl Deref for BooterFirmware { - type Target =3D DmaObject; - - fn deref(&self) -> &Self::Target { - &self.ucode.0 - } -} - impl FalconFirmware for BooterFirmware { type Target =3D Sec2; } diff --git a/drivers/gpu/nova-core/firmware/fwsec.rs b/drivers/gpu/nova-cor= e/firmware/fwsec.rs index df3d8de14ca1..7fff3acdaa73 100644 --- a/drivers/gpu/nova-core/firmware/fwsec.rs +++ b/drivers/gpu/nova-core/firmware/fwsec.rs @@ -10,10 +10,7 @@ //! - The command to be run, as this firmware can perform several tasks ; //! - The ucode signature, so the GSP falcon can run FWSEC in HS mode. =20 -use core::{ - marker::PhantomData, - ops::Deref, // -}; +use core::marker::PhantomData; =20 use kernel::{ device::{ @@ -28,7 +25,6 @@ }; =20 use crate::{ - dma::DmaObject, driver::Bar0, falcon::{ gsp::Gsp, @@ -40,7 +36,7 @@ }, firmware::{ FalconUCodeDesc, - FirmwareDmaObject, + FirmwareObject, FirmwareSignature, Signed, Unsigned, // @@ -174,52 +170,21 @@ fn as_ref(&self) -> &[u8] { =20 impl FirmwareSignature for Bcrt30Rsa3kSignature {} =20 -/// Reinterpret the area starting from `offset` in `fw` as an instance of = `T` (which must implement -/// [`FromBytes`]) and return a reference to it. -/// -/// # Safety -/// -/// * Callers must ensure that the device does not read/write to/from memo= ry while the returned -/// reference is live. -/// * Callers must ensure that this call does not race with a write to the= same region while -/// the returned reference is live. -unsafe fn transmute(fw: &DmaObject, offset: usize) -= > Result<&T> { - // SAFETY: The safety requirements of the function guarantee the devic= e won't read - // or write to memory while the reference is alive and that this call = won't race - // with writes to the same memory region. - T::from_bytes(unsafe { fw.as_slice(offset, size_of::())? }).ok_or(E= INVAL) -} - -/// Reinterpret the area starting from `offset` in `fw` as a mutable insta= nce of `T` (which must -/// implement [`FromBytes`]) and return a reference to it. -/// -/// # Safety -/// -/// * Callers must ensure that the device does not read/write to/from memo= ry while the returned -/// slice is live. -/// * Callers must ensure that this call does not race with a read or writ= e to the same region -/// while the returned slice is live. -unsafe fn transmute_mut( - fw: &mut DmaObject, - offset: usize, -) -> Result<&mut T> { - // SAFETY: The safety requirements of the function guarantee the devic= e won't read - // or write to memory while the reference is alive and that this call = won't race - // with writes or reads to the same memory region. - T::from_bytes_mut(unsafe { fw.as_slice_mut(offset, size_of::())? })= .ok_or(EINVAL) -} - /// The FWSEC microcode, extracted from the BIOS and to be run on the GSP = falcon. /// /// It is responsible for e.g. carving out the WPR2 region as the first st= ep of the GSP bootflow. pub(crate) struct FwsecFirmware { /// Descriptor of the firmware. desc: FalconUCodeDesc, - /// GPU-accessible DMA object containing the firmware. - ucode: FirmwareDmaObject, + /// Object containing the firmware binary. + ucode: FirmwareObject, } =20 impl FalconLoadParams for FwsecFirmware { + fn as_slice(&self) -> &[u8] { + self.ucode.0.as_slice() + } + fn imem_sec_load_params(&self) -> FalconLoadTarget { self.desc.imem_sec_load_params() } @@ -245,23 +210,15 @@ fn boot_addr(&self) -> u32 { } } =20 -impl Deref for FwsecFirmware { - type Target =3D DmaObject; - - fn deref(&self) -> &Self::Target { - &self.ucode.0 - } -} - impl FalconFirmware for FwsecFirmware { type Target =3D Gsp; } =20 -impl FirmwareDmaObject { - fn new_fwsec(dev: &Device, bios: &Vbios, cmd: FwsecComm= and) -> Result { +impl FirmwareObject { + fn new_fwsec(bios: &Vbios, cmd: FwsecCommand) -> Result { let desc =3D bios.fwsec_image().header()?; - let ucode =3D bios.fwsec_image().ucode(&desc)?; - let mut dma_object =3D DmaObject::from_data(dev, ucode)?; + let mut ucode =3D KVVec::new(); + ucode.extend_from_slice(bios.fwsec_image().ucode(&desc)?, GFP_KERN= EL)?; =20 let hdr_offset =3D desc .imem_load_size() @@ -269,8 +226,11 @@ fn new_fwsec(dev: &Device, bios: &Vbios= , cmd: FwsecCommand) -> Re .map(usize::from_safe_cast) .ok_or(EINVAL)?; =20 - // SAFETY: we have exclusive access to `dma_object`. - let hdr: &FalconAppifHdrV1 =3D unsafe { transmute(&dma_object, hdr= _offset) }?; + let hdr =3D ucode + .get(hdr_offset..) + .and_then(FalconAppifHdrV1::from_bytes_prefix) + .ok_or(EINVAL)? + .0; =20 if hdr.version !=3D 1 { return Err(EINVAL); @@ -284,8 +244,11 @@ fn new_fwsec(dev: &Device, bios: &Vbios= , cmd: FwsecCommand) -> Re .and_then(|o| o.checked_add(i.checked_mul(usize::from(hdr.= entry_size))?)) .ok_or(EINVAL)?; =20 - // SAFETY: we have exclusive access to `dma_object`. - let app: &FalconAppifV1 =3D unsafe { transmute(&dma_object, en= try_offset) }?; + let app =3D ucode + .get(entry_offset..) + .and_then(FalconAppifV1::from_bytes_prefix) + .ok_or(EINVAL)? + .0; =20 if app.id !=3D NVFW_FALCON_APPIF_ID_DMEMMAPPER { continue; @@ -298,9 +261,11 @@ fn new_fwsec(dev: &Device, bios: &Vbios= , cmd: FwsecCommand) -> Re .map(usize::from_safe_cast) .ok_or(EINVAL)?; =20 - let dmem_mapper: &mut FalconAppifDmemmapperV3 =3D - // SAFETY: we have exclusive access to `dma_object`. - unsafe { transmute_mut(&mut dma_object, dmem_mapper_offset= ) }?; + let dmem_mapper =3D ucode + .get_mut(dmem_mapper_offset..) + .and_then(FalconAppifDmemmapperV3::from_bytes_mut_prefix) + .ok_or(EINVAL)? + .0; =20 dmem_mapper.init_cmd =3D match cmd { FwsecCommand::Frts { .. } =3D> NVFW_FALCON_APPIF_DMEMMAPPE= R_CMD_FRTS, @@ -314,9 +279,11 @@ fn new_fwsec(dev: &Device, bios: &Vbios= , cmd: FwsecCommand) -> Re .map(usize::from_safe_cast) .ok_or(EINVAL)?; =20 - let frts_cmd: &mut FrtsCmd =3D - // SAFETY: we have exclusive access to `dma_object`. - unsafe { transmute_mut(&mut dma_object, frts_cmd_offset) }= ?; + let frts_cmd =3D ucode + .get_mut(frts_cmd_offset..) + .and_then(FrtsCmd::from_bytes_mut_prefix) + .ok_or(EINVAL)? + .0; =20 frts_cmd.read_vbios =3D ReadVbios { ver: 1, @@ -340,7 +307,7 @@ fn new_fwsec(dev: &Device, bios: &Vbios,= cmd: FwsecCommand) -> Re } =20 // Return early as we found and patched the DMEMMAPPER region. - return Ok(Self(dma_object, PhantomData)); + return Ok(Self(ucode, PhantomData)); } =20 Err(ENOTSUPP) @@ -357,7 +324,7 @@ pub(crate) fn new( bios: &Vbios, cmd: FwsecCommand, ) -> Result { - let ucode_dma =3D FirmwareDmaObject::::new_fwsec(dev, bio= s, cmd)?; + let ucode_dma =3D FirmwareObject::::new_fwsec(bios, cmd)?; =20 // Patch signature if needed. let desc =3D bios.fwsec_image().header()?; @@ -429,7 +396,7 @@ pub(crate) fn run( .reset(bar) .inspect_err(|e| dev_err!(dev, "Failed to reset GSP falcon: {:= ?}\n", e))?; falcon - .load(bar, self) + .load(dev, bar, self) .inspect_err(|e| dev_err!(dev, "Failed to load FWSEC firmware:= {:?}\n", e))?; let (mbox0, _) =3D falcon .boot(bar, Some(0), None) diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index c56029f444cb..78957ed8814f 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -178,7 +178,7 @@ pub(crate) fn boot( ); =20 sec2_falcon.reset(bar)?; - sec2_falcon.load(bar, &booter_loader)?; + sec2_falcon.load(dev, bar, &booter_loader)?; let wpr_handle =3D wpr_meta.dma_handle(); let (mbox0, mbox1) =3D sec2_falcon.boot( bar, --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013009.outbound.protection.outlook.com [40.107.201.9]) (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 A958A33BBAD; Fri, 6 Mar 2026 04:52:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.9 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772779; cv=fail; b=m5lgL9n1UUQwEHgf7Hwms2uxvKG+ieHw9g5yVd562txJk2oMRqgEc65m/M+0m1DLadpoMXZYMBenI77l/zIB88gSmd9VPlirmGE9G9LisrLmBciBwFOEJxjFP16Bz7fOyFsO3bjZPXhDCNDdQH3fNPoD86T3G5KMvbrbcCWM+ik= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772779; c=relaxed/simple; bh=NF8ptz5CHBG420myl4lTMwR9ZfMn0i/sFRdmMzT+40c=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=HtBxp0H/w37hhAl+UOjGrbagrtoYEtGhI+ADfSk1N1/pKR6nVWyhQ3hD7glpcSnWb8KGkhCl6XpiZOb8cEKF12yLoAYNuTBBUlloQQfeRSEXwMcVORf0tUyyhbZhl/slEvr1CAOzqfEGwbeaCaqO9LQccyeCunwkC1/vdPi1IuA= 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=gYIC+fAJ; arc=fail smtp.client-ip=40.107.201.9 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="gYIC+fAJ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JdGMzOkqaK5lwZxXCwywC0szzw/QvHtCZytweGceFljC+RrNvM1j9xbzDL4Ft1QLeq3kgi4WAYYTignWScrZFe6dTp+P+8PN5UgRoQ/GmWGVot/+RaMfM6KCzZpFnCby3gh70G9BP57M3VRNYKVYBXV5BGy2+x90R73fpa4XsrVahmaAGZ89CbkKGXrUu+Vu2PaBUdYn1e9HhvMZnwU8U0B1JhfwT+WoyDuPI58lRRKYDnWx7gluiMXnS6UiRul6N7AWZFvjtXNlXI40C6aAdBKH8mrGgl2C8D/aetn9I4gqpBHUaERtrXTc5g7IBvguU42JU1OJIv4+V4wQwSsaUA== 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=u7/uKOW9wwl7B9mazzKQg6AYuhSUJOjd3/mq2W8PaQ4=; b=bqFabOMjoZ6tHlbeCYaQpmNdve0RkH69A+k4vmVuvwidpP6gbzGzQhz/qQojz+xR7cd2gZsgNdcOjezVrxSsDIndjtliQ4xMZD4npSr5HEBtabTc4ynyJJuU0sLLj0XpYOrVbT9Xfd38MKJSgnCW1v1wgoBtKxuV8eQfq4Q/C4E+8mx8O7/pRgcEZBKvKrdh67MDldMzXH2AZY0ltyKiAk0eYxAweNLPsIbMKEtMha6d+yHSn1fZhJ8Lu6JbSbjnS4QgtdkutW3/shCDRdSRovZz/5WpIIhieRwg28fraFBSWiJVzTCtziCJ0DlMKrNI58W1B2TPKoE8wUNRxNKVEQ== 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=u7/uKOW9wwl7B9mazzKQg6AYuhSUJOjd3/mq2W8PaQ4=; b=gYIC+fAJqzJfoQWGRq6NJSx9kYSs3F8AJSDL4fC5yg1NURF45DNvjIpFbYeGsaVyFLHU2XZUb3tQC3A++uIDglxFXTc5aOXGsZIwkHFHPRw1XCPvjaY2YKKKJ8QJQmOoiFqlJohPcoyisaa7kz7y6QzyFRDriNTsJq658Z3UJ8U6eXTE1KpD44JbTmA+cyY/IfUrxNDke6CL3fkt0wZbaLgtOUtB3sfH+BTNiLz0kHCywZs81dZrjfVSi5Cte08mqWYG/X2YVrOxiYj9kVEQwb8oj8agl4kgeo8nSKfRdsozO3/zEqnrOJgCBoFwV8wgwc6Pn7OPdQf7wCAVAoY3ug== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by BL3PR12MB6569.namprd12.prod.outlook.com (2603:10b6:208:38c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.5; Fri, 6 Mar 2026 04:52:55 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:52:55 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:39 +0900 Subject: [PATCH v11 02/12] gpu: nova-core: falcon: add constant for memory block alignment Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-2-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYCPR01CA0110.jpnprd01.prod.outlook.com (2603:1096:405:4::26) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|BL3PR12MB6569:EE_ X-MS-Office365-Filtering-Correlation-Id: 17d8bd01-356d-4fcc-bc3e-08de7b3c3ad3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|10070799003|376014; X-Microsoft-Antispam-Message-Info: 1MbcEjTByEsMRw+hvaFgoyBuc0pSEWMWxqZN+piklnlrTxJVNAoI39ZWRdmPrCYF8YFT9RNUMiSKYlSodaBHu+44z08iogQbIh8IN64SdNGkydPg6BWKteYN2fA7sWUukH0bd+8ERXDpSDaX9GZ/RNYdTjpBFwwzV1iMM6F87+MS/G+LJEsXZ5pGcMjT3pdMPVU+pHlQHMASSlVJpKfupUuRGFgHrHTZg69EYdda0sUjC0pGDlt/+uCz0JJ9El0p9mpx1nIu7MQt1kNP3G756+jWib2DCUJO9mgIpd/aID2jTAJ1j1x48lRbbAEZNaxTnl4VMndPsJQfx1Mw4b/BSQCX51nm1fd3Jtl8svt2i5KFpqst82ta8pN3z6a9xHGlzuqBbnTTfcVl9q2nfLCvlKjkIfAD1yGxJrkfB2qBOrhPNamuqTFtED6y6L+QT3L673AlcTTSqfPoTwrHDzhFXvxf6I93/auCjku/qxbo+BpTNZJWyUfY7Z18eektaeA0K6rFS9+DvYS+kpZPGxkZg4M8jF1WJ1OIPTIhDykq01M0briY2EzEYNgbt6f1SMHBlyTLYuIW1LsYwu89NF5YNJYD3lN36xcpfVk5vRsxslEO9FamdeGo1RN8n1xE4K+Ydnb81BulnLxKIqlAQtN7Dt6a+hcZzrgkNxXVuDdqCNYd20Rui8ypWGf+8lCrt0618f/3TXAWSQTKRUP3bjwU/XbW8fvjHTHkgkEyrtzyQh4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(10070799003)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?UzlaZ3NjMmdseVdBZ1RwZGZqQy9YNko1cGtIUDM1UE1weU5DMFFDelZKNnJ3?= =?utf-8?B?dUV4bEZuY2dKNHpxMElzSy8yaCtLeGR4SnVvUHRmbVFncDVsczF3aGZ3QXZ4?= =?utf-8?B?KzJxS1dCSHBFWkcvZmsyR0JjeUt6K1c5N1ZJaEFTK1hDTGZvdXVIQmRLUGJF?= =?utf-8?B?dGpiSURKZWljbG9rYnJ1Ly95V01WNGtFRTNEdm9wdkFFNy82cGVWWEk4aUps?= =?utf-8?B?N2M1eEs4aFpRYW1wK0NrL2lKNHJWV2FxSWhZODZWMGpYaFEwZ1V3VkVoT0Zm?= =?utf-8?B?UWdHeGxwRm1BcXhPQnMxWU9uYVlrODFXWUQrTmRaVFdaT3htTkVRSThIbGhS?= =?utf-8?B?RVIxU2hNVHJ0aVFqNUZad2p3STJSNG9UREprOGkrRk9YeXVhQjNxcks4d0Jk?= =?utf-8?B?VGpFSVpUWVNHa2ROUTN6RVltQmJtNVIzZ1FQbWV2OTk0TTkrd01QbVRKRVM0?= =?utf-8?B?cm9Oc2JHQjRTbXNnU3JLRlR2Tk5iQlJzbjZUOVZScjAyMkZDQmlIbVEvbHdr?= =?utf-8?B?N2VuUS90V3Y5c2R5L3JOVkMxaDhLRzR4YnkwbWVJUVY5dnRKTDV4b3gvcU12?= =?utf-8?B?Rko2LzRzVmY0UFIvL2FadGo0R21vbk1RSHVNZXdWZXR5TlpSbDlvYmRySjYx?= =?utf-8?B?Q1M0aXNRU1JLV0JPQ2FvVVVFYmZzWitUSmt1K2lldjhNMDNDQ2hFTVpzTUky?= =?utf-8?B?clFSZHNoNTVBejNJMDFkVHgzWlRvQ1hQRUI4ZGsyL2h6dk1lc21YMW5hWEJ0?= =?utf-8?B?Sld5VmpBUXlLUG95d1M2M2FQTkxGbkh1RnRseHF2THNKNEtHZ2x1SUdYUExO?= =?utf-8?B?MDNNeXo2cC9aRUR2NVVtSTVmUEtoQ0x3OFk1cmdKWkxGVW1MN2NXNld5V2Fj?= =?utf-8?B?clVYY21nV3ZNUDl1OGx1RyszY2hYMTF6aDRmNUdCS2Y1SzVKVFVoR3FZdEJB?= =?utf-8?B?M0NqcThiNnQ3dm14WUJFU24vRUdNb2huOGVNWlcveW1kNlpNRzZWNkdjQmFG?= =?utf-8?B?bEFqRy8rWTg2ZFg0NEZsaXFrbjUzVU1pbElaWU82bHJkZE1XSWJUSDF0OG9Q?= =?utf-8?B?cThhcG9VaVhFK01rb2FXWXZJNTNQek8xQkdydU12cHJKMS91UnI0UmhkZVhO?= =?utf-8?B?Z2lUeGN0eVJCNWZEQUplQXJEeXlzTlU3eU1EZnd2b3NmRE5VUjV2UDBablpR?= =?utf-8?B?RGxDY1Q5dTNtZnZ2R3RNeThpd3drWjM3WUx5LzBiYy9QYWxwVkVkTVh1SHJK?= =?utf-8?B?YzBvWXZZc0JLU2RETmNTYzArYW0vZStWTEtFcmlxQ0QzMXVrRVR4elRiMEo0?= =?utf-8?B?NW12cWdVQjlWdXpJYjFmaW1FSHNISTRCNkp6WGE3TlhVMk0zSjFsYWRBelZN?= =?utf-8?B?cUVFWENMTWR5M0tlSm5vOS91RElhZ0tuZ3RzVUNWcDlueDNzaFBaend6MlhP?= =?utf-8?B?YVgzdVBsY1EwK3RKM3pIZ3Zab0UvaUdzYXlFd2RMd2hrWGR1aURiMEFSMzJu?= =?utf-8?B?WjRPKzZocEc4c245cEN4K1ovaTBob2NqTGptYWFiaitHSEtRY2Y4U0RrakNK?= =?utf-8?B?K2x4emZTeVluYnlJa1RYdWg4VFRTMXpidlNjS0hqSDNEK0FUeDhDaEJUMG5E?= =?utf-8?B?K2hqTE1SMWFtUjRIYkNueERETzdyazgycGJCZURJSEhwLytXTjUxOUJlVStl?= =?utf-8?B?ZWN3a2Nha2hTdXA0NWRNNlZ2QWtSSm5tWnRIWmt5bGxwc2pxV3d3SmJkV0Vu?= =?utf-8?B?RzI3U3hBTXQ5TjFqZHp4YmZRS3pPSTc5TWFSU0VZWTREM3pncjZNS0JSMEVK?= =?utf-8?B?aWxwcFAvRFFRamRmK2pVYXYvQTNZMndIYS81b2lJNy85L3RiTW5GeGFSU1RB?= =?utf-8?B?NXV1YTVBcmJTSXdva0dtQXZKbGdFZTk3VU1qR1hRVTZYNno0OWdEVDJqcXFV?= =?utf-8?B?RDdNTUZsNUtiUWJsNkxZQ0FVRkxNYkRJd3Noa28zSEFoZUNGZnRHYU5XbU9z?= =?utf-8?B?NThsL1FGUk9IMzVpcldHRmhFa003VmdhZzhtMkx1dkM3RFY4c1NqRmVuQXRv?= =?utf-8?B?U01HakZEa2hTUHVWZmZBc0ptNGZoZWdOL2ppSG82aVI5VFFYcFJwclJ1QnFK?= =?utf-8?B?Y2JHRGVmV1M4V3FOQjU1RjJJUm1wQzZ3R29hczlFTnhLeUJ2V3ZuaEZIMkE4?= =?utf-8?B?aE8wSHN5N3FjZTgzUE44RWdYTHIzc0k3M08vVmVnUmNmU015ck5iZ0NIWWgv?= =?utf-8?B?UmVSSzFSalgyQWFLcXFkNmY3Nyt5d29TVDhCbjlIV2xiNUlpMVVRTnU4Z1FB?= =?utf-8?B?bnlHZ0lMWXZiRVcyYlVzTUg4eUxPbXJFV1FMNVhtSXAwSUt4QS9hbVlpN0sv?= =?utf-8?Q?VY6FOpsTA9cca5UYdtiRiYB6//nR7+8UI9L9z3ilRCrQk?= X-MS-Exchange-AntiSpam-MessageData-1: b8jJfMVqy9E+oQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 17d8bd01-356d-4fcc-bc3e-08de7b3c3ad3 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:52:54.9564 (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: wslLQl9qb6Dn5gA7PjWw7JsM987afdHnD+MQSxFMq3QIEcRwwWLcYNCPjfuZrRua+MtnsznqP8k6wHrhaQ4T5g== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR12MB6569 Falcon memory blocks are 256 bytes in size. This is a hard constant on all models. This value was hardcoded, so turn it into a documented constant. It will also become useful with the PIO loading code. Reviewed-by: Eliot Courtney Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/falcon.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 8d444cf9d55c..31217cd3a795 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -25,6 +25,7 @@ falcon::hal::LoadMethod, gpu::Chipset, num::{ + self, FromSafeCast, IntoSafeCast, // }, @@ -36,6 +37,9 @@ mod hal; pub(crate) mod sec2; =20 +/// Alignment (in bytes) of falcon memory blocks. +pub(crate) const MEM_BLOCK_ALIGNMENT: usize =3D 256; + // TODO[FPRI]: Replace with `ToPrimitive`. macro_rules! impl_from_enum_to_u8 { ($enum_type:ty) =3D> { @@ -423,7 +427,7 @@ fn dma_wr( target_mem: FalconMem, load_offsets: FalconLoadTarget, ) -> Result { - const DMA_LEN: u32 =3D 256; + const DMA_LEN: u32 =3D num::usize_into_u32::<{ MEM_BLOCK_ALIGNMENT= }>(); =20 // For IMEM, we want to use the start offset as a virtual address = tag for each page, since // code addresses in the firmware (and the boot vector) are virtua= l. --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013049.outbound.protection.outlook.com [40.107.201.49]) (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 4ADC9327BFC; Fri, 6 Mar 2026 04:53:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772784; cv=fail; b=ABMuWfbCCP/bBe6LXV+fFYJecy8LV9SQHU0D6dG1wMIgeWTVtKcHDEyUpBzMi/E/K9aisyfSn7xp8HC494S3LtxksB8t26GYVbBD815pBhtFNajsJl/PVnulSGIV+C/nU1aKxhBaSd0OywK2wJO2eLMzHxaxuia0yWQureulC1k= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772784; c=relaxed/simple; bh=aDcIXrsMhzW+Hzq26I3qZ3EsTq9NAA2bgcgHjz/p400=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=hfwpAcRslm65etFUQFvI4u0FYPRbhYaGjzl2cE+8VcM6wNLmuovQzl3nuXRwlYRg4qWcXCg+uiAsXU2bStsn06Yw/c058w79Vnh52fKH47ONi1tb8ZfIoEl2piQFJaWu83fqEMd+FwakVcHkT0X5v3nknf3QLCBY3rL7JwmY8uA= 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=jJrEtgID; arc=fail smtp.client-ip=40.107.201.49 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="jJrEtgID" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=udAfRvLDm0MK+HUfZ2sKbI1l5NCTFf+wg/JxTeSZ31m67noYVOH8OZpNLoUyHYBQXpdEW1xnjX6dxRlE3M2uEP3eczBQSv+oNSLM6K4s3pa+o0S0sIkDToeWg/O6pmnTw8Svb3n+se4pxsJikdoLn0FPnZfoipAZB/F+Q9C8chjIEAtWH0EKJTNMZExHFO1hEIkJbZjEskUBneGYy5wR2u1NZxfBDvqY3wiwIdB2CH0O6lLDDxDwQyikXHuQNwyhVVPDWFvCafbmDGkLMP0wge6yUjas4fpBPxN/FiJmTf+EyuiLLNuS2HxaujHv8hW1W+vKVZRsOGwGYX+UhJCOHQ== 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=KJHNqvj+vHIFOj+nbKza1C9BCWGxq0Yuhe0jCOsEXSw=; b=ffu8FKDGa8nKwAmGiIAVTH2/oflYL0l/ImrQDo495tuVDIxmFCI7DstYhz6Ku8g9S+qeemVyqxYL9dkjoQh3Ol2ojP/nEFFPwtMaozpgmewJr9jJVURdUM+H3dwAWFIQGzxH/wixgQPRbDWB9sLEqUJtI/DSbBx22DWIhKYG6NAk8EOlOLCpB8KyZvYY1nASjOgm4iYv+KT6k/SDlVMw36MRRCaTQOCa0KPplErgHPyI7SrUsVcy+07EnS/JxgDDE9QQOgdOjIpTjxxQ5NEneGmM+KH/6An7LZFF3HZGjY6P6NWuEWQ34pVjvCd5vTk4tJucbAUvFXxacDZcK8cDoA== 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=KJHNqvj+vHIFOj+nbKza1C9BCWGxq0Yuhe0jCOsEXSw=; b=jJrEtgIDJQ0L47GtxxQsdBJQP3elSLfkb5oh4GfS2IFgbh+63xY5tgcDAV+KajlnFpt1WI5aeAmLXYguZSiriULYAzXEayzCCQnlg0RDwrRvk2jct7esNt7drCAzNgLygjyZSheRv6tIJOptSdGUy7fUP09tHlvymSHrUR0lGbblH/oiKNivw6aKPqAV9M7W/PQWSQhPxAVRlXViBGHLbM7ZBZo38N0TuFLpjZ2gxzd+uZHg13DBxEFHrL1jMDizm6Q2tJOv/zkG80SJa+JojuqqggmpuXOYhkAlo46pYt5qZyNS81HvnpXNRh2k+EFYnHGQk5KFNiQd0TzrgHpi8w== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by BL3PR12MB6569.namprd12.prod.outlook.com (2603:10b6:208:38c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.5; Fri, 6 Mar 2026 04:52:59 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:52:59 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:40 +0900 Subject: [PATCH v11 03/12] gpu: nova-core: falcon: rename load parameters to reflect DMA dependency Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-3-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4PR01CA0094.jpnprd01.prod.outlook.com (2603:1096:405:37d::18) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|BL3PR12MB6569:EE_ X-MS-Office365-Filtering-Correlation-Id: abab9dd2-5629-49e0-1399-08de7b3c3d10 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|10070799003|376014; X-Microsoft-Antispam-Message-Info: 4WUmug/Uq39B7qe1jKxYF9qUuQ1Qut1+wVJRRnzObvv4EyFMZr/gY2ULaRSMAHiKj3z9iFmXCccpCzbWCOKZay/jvr/RFEFodYzOgrfRxJLvEAsR8cA8dOWOD+m3SjXyL0OuQAa1zjOwgcvKZA1GgFbKz24f4ncsOzLTAzDnutqU4lRI5YFWKVhXdQW7MRMYH+iku9LVEwcbjniUb2Dl9bHkdnQFu+j8Ul+OZjgXSgdQ4utFrffePkmaKoNbw+lO3e1RFzhT3vxmiTuSXaUvBCCBf1gGhh/r19Wp+OFtPbh0IUa94Mhnad5iSkhd9iLsu3jUrrjzCx4/DWLQZk62uPVsTuc3WUEiHf94PtUzE7mm8vdu/l8QdXLj4LL3q97YJmvTYeGKShStbAoPKhKPtfWLXxSLEVjFizXy8Orel7o2YppOhIwLb/jZIbrTHYlMHZxbxv9B4bkZPYj/JloiTsQFGoX/la7Y6RiwOlh4xx2p3WA8YtUZ4TY2Y+hwOTxwxzD4sX3WpTA3teSESOpe13ytrIVUduo9G0GQ8sdsGYZGjFR8iM74IpbFqcPIznPjdKb5Czqk0jypZkTfI0wJ+6xlRu2rqVWN7vzuMcG59IX7ADClGUzzNimrCZ68nzLpt3NhvXbtekuoNOSQ+9MOTeoOsqpPAgDTrPI9jit/bBG1Z23rjFJGgMPESdex5wzbFE8AbPei7eY9gah81LNTDbJfe9NV7nFB1jFhsHjqwHY= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(10070799003)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cDBNeGhhNUFpMjNlM0VLM1JxcTdmUTdwaXMzZTZmWXlwVnd5NnRIZG96Rm9H?= =?utf-8?B?TXNiYXo0RkVWdGtMdkhPelVwYUNxaXN6Myttand0eVFUdHc1a212dUhXd0Qw?= =?utf-8?B?WWJ3WHU0K1BPWUFOR1hSM3dreWV1WHhXbWxCc0RxaEdoczYwOGtnRFhqWWZ1?= =?utf-8?B?MFVHRncweFZ1Tm5FUEgzN005RDRrOTAzVlFEdVNIcHkxcmllZDdEVnBsdzVO?= =?utf-8?B?TXRxZ3J0cGxpVFFGUW1TaUh2ellNalhvNkk1UWdGUnF3QnlWRExOeHpZRjA2?= =?utf-8?B?VytLMGJJc1lucjZ1eHgzUmRUUkc2SXllV3FrVFRNc3h2R3pmQS9qT29qVmlu?= =?utf-8?B?L2hFa09MYUFQV2lQVkErN25WazFkcGJTalVJV2VLNkpmd1ZLK1hMdlhTTk9X?= =?utf-8?B?bVhXakprb3RYRjUwUURJeWQ2bXcreWVMalJjd2N3bTcwdE50MitwYzZsYmVJ?= =?utf-8?B?RmR4VVlzVlhrTzdBTlVkVlg3NEVzTGJORngxZHZGbHlGZFVhZnRRck1XaTYr?= =?utf-8?B?V1BHK3pYUWRMZlBVWDY3V1VzR2tKM1o5RThMMWZWc1V3TGVWWUNlamMrS0R0?= =?utf-8?B?ZDNuc1hmSDgrZEkzNVo1Tm00M25uZmwrZ0NzcFljQ3ZTU3hjREpOajlzSWhr?= =?utf-8?B?Mkc0eDlGUE1kdnF1REExRVJPbEM2YTNxYndza0hmNjJweTdqTC9ISUdsaHF3?= =?utf-8?B?K2J2SmJiblJTOVkzNFhRTTkxSDU1c2sxRmllcWEvZjFZc0lvQkdNV1ZNWXZD?= =?utf-8?B?ZlkvY3k0NFNNbTdTb0xqMjFySHNrckZGUEhIWXpmTkRvOFQzN2FuenJpTExz?= =?utf-8?B?VllNakJSN0s5cWhhdE1leWFOdjl5M0o0Q1pDWmc4UWFpV2NRZWJ3MjZHWkkr?= =?utf-8?B?alRlUExmeGFtNlVqaG9YMk0yVFZGK0J3bHdJMnB6eUR4UW43cTJEV0htNHlP?= =?utf-8?B?Y3dsWHdsaTdYdmZHZ01md2hpc1pubFlmbkd0VnZha2VWTU1KT1RNRmo4aUtN?= =?utf-8?B?ajlhb0p3bDhYaGxZSDNpNTRXcmVBVWVkM0dLbG82S1lxc2d2NEdmTUJkajFj?= =?utf-8?B?SldkNVZaWDhmWVRCYzBwdGtNVk8zQzdNelJFTXpkTkc4Zmd0TDJNL3lOYUpx?= =?utf-8?B?cy9Od0xleDJ3UWZJL2ppaU9MVzJrSTNEYmxoNWhncG1ESHN3cWNOcjBodysr?= =?utf-8?B?YXRqWUFxa1FCNzhYL205d0dvQ1g0YWMrcXNNMFArY3VCL2lzRVRNUmtHWGJn?= =?utf-8?B?aU5CZ3BvbDk0a1laMUVMTERtWTJKTHFJd2dmelZDODQwVmdOT0FrOGJMQmpH?= =?utf-8?B?N0VtZHdwV0lJbGRQKzlZSDBsU2dxTlRvRGtaRXdRSUw3cVNPM0loZmxGZkZO?= =?utf-8?B?UnBxZmxlVEVQNWYvejFkUVlTOU9CUHZ1RUY0eDYrZXB2aU40V2FLbHAyVDQ0?= =?utf-8?B?ODZjZFFtZUhKbmZ2QVJaRVlGMUhucDJmK0dmRXc3WmRCWnFVbGhFcndIQllr?= =?utf-8?B?SkNXU1UxR0tYR0hPTndreHRmR2FHTFhRQjdNOFpObDNaay9XNUp3dWZTbGlk?= =?utf-8?B?RTY0YjlZQm5yNndDVk55QnN6ZHdEWThDQWhwd3dwYWhaZlNWbXJ5dnRZVVNt?= =?utf-8?B?dXBUTStITGFGdndpenYvOTBrWVUrUEoreE5vTjJzdlNxL05VaHpLWmNjVHV4?= =?utf-8?B?RWhiWlBiemY3clRuSVdiWm5DNHRDWU5NWkpwc2hxY0svcytRN1liNml4akJm?= =?utf-8?B?SWtWUFdQSkxObjZiVWlIQ2YybXVzREhWakFUN0I5YllxOStUL3V0NzhRWDg4?= =?utf-8?B?bXRUMnJOa3RUSkR5MU5yTFFqb0cyWlpKTDMvOURjNW5heEVpYlNNWUJTMEp0?= =?utf-8?B?NytKVFNaVlRja3lCZm1SdnJ6T0pLTEExbnRHTTBZQ280NmdLM05GcXNCeXVD?= =?utf-8?B?K3kxdlo0NDZCczZpV3RnYjdhNStVWHh0akY5dFJ2bTRrSkRlRHRxUldkVUh5?= =?utf-8?B?ZjRhekJvTzRLRGw3Uko0TjFkSkRJbnpMMFdtbDNHbXhCd0JKNGFuZnVYcG51?= =?utf-8?B?Z1FkV1BqeXhjL2pFR09mYmJNeFlwcHQzWC9JNXdHM09NQ1pRYUZGS1ZRRVkv?= =?utf-8?B?Y05VLzNISE9yVEZCOFpKanRtZGpGRTNuZ3g0bDlQdU1Tc1hHbTEvZCtMOUtv?= =?utf-8?B?YVRTckhFemt0cGo2UmJFRkNqRTY1L01DSlY2ZzZKYWlGSzh0UURIUEhxY1hX?= =?utf-8?B?c29TYzZ0S1pKUEVPTDh0dzBxZFJmYmZDUGNNeXVxSUFGNUdOQ0x6MjlySUls?= =?utf-8?B?NnNuTUpqV3lvVm16VllGa3RnSDVYNlhQdkhhTnk4aXhDWWNEUkJzTFUvelhp?= =?utf-8?Q?Nwe1Ve/nUEolAYVxzaGwIYtyZkud45dWkTYOkeYYInoJ4?= X-MS-Exchange-AntiSpam-MessageData-1: RlE42s9Lc3WrOA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: abab9dd2-5629-49e0-1399-08de7b3c3d10 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:52:58.9914 (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: cbJLuN1XjLlng2Qc87bz60I9o9p+acy9uldO66mOAMlE2T9Mll3HYFbhiojQ+I1VG1DtPC2HZtEim3fryz2i0Q== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR12MB6569 The current `FalconLoadParams` and `FalconLoadTarget` types are fit for DMA loading, but not so much for PIO loading which will require its own types. Start by renaming them to something that indicates that they are indeed DMA-related. Signed-off-by: Alexandre Courbot Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/falcon.rs | 19 ++++++++++--------- drivers/gpu/nova-core/firmware.rs | 30 +++++++++++++++-------------= -- drivers/gpu/nova-core/firmware/booter.rs | 24 ++++++++++++------------ drivers/gpu/nova-core/firmware/fwsec.rs | 12 ++++++------ 4 files changed, 43 insertions(+), 42 deletions(-) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 31217cd3a795..9eb827477e5e 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -330,9 +330,10 @@ pub(crate) trait FalconEngine: const ID: Self; } =20 -/// Represents a portion of the firmware to be loaded into a particular me= mory (e.g. IMEM or DMEM). +/// Represents a portion of the firmware to be loaded into a particular me= mory (e.g. IMEM or DMEM) +/// using DMA. #[derive(Debug, Clone)] -pub(crate) struct FalconLoadTarget { +pub(crate) struct FalconDmaLoadTarget { /// Offset from the start of the source object to copy from. pub(crate) src_start: u32, /// Offset from the start of the destination memory to copy into. @@ -352,20 +353,20 @@ pub(crate) struct FalconBromParams { pub(crate) ucode_id: u8, } =20 -/// Trait for providing load parameters of falcon firmwares. -pub(crate) trait FalconLoadParams { +/// Trait implemented by falcon firmwares that can be loaded using DMA. +pub(crate) trait FalconDmaLoadable { /// Returns the firmware data as a slice of bytes. fn as_slice(&self) -> &[u8]; =20 /// Returns the load parameters for Secure `IMEM`. - fn imem_sec_load_params(&self) -> FalconLoadTarget; + fn imem_sec_load_params(&self) -> FalconDmaLoadTarget; =20 /// Returns the load parameters for Non-Secure `IMEM`, /// used only on Turing and GA100. - fn imem_ns_load_params(&self) -> Option; + fn imem_ns_load_params(&self) -> Option; =20 /// Returns the load parameters for `DMEM`. - fn dmem_load_params(&self) -> FalconLoadTarget; + fn dmem_load_params(&self) -> FalconDmaLoadTarget; =20 /// Returns the parameters to write into the BROM registers. fn brom_params(&self) -> FalconBromParams; @@ -377,7 +378,7 @@ pub(crate) trait FalconLoadParams { /// Trait for a falcon firmware. /// /// A falcon firmware can be loaded on a given engine. -pub(crate) trait FalconFirmware: FalconLoadParams { +pub(crate) trait FalconFirmware: FalconDmaLoadable { /// Engine on which this firmware is to be loaded. type Target: FalconEngine; } @@ -425,7 +426,7 @@ fn dma_wr( bar: &Bar0, dma_obj: &DmaObject, target_mem: FalconMem, - load_offsets: FalconLoadTarget, + load_offsets: FalconDmaLoadTarget, ) -> Result { const DMA_LEN: u32 =3D num::usize_into_u32::<{ MEM_BLOCK_ALIGNMENT= }>(); =20 diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index 09b12ad546c2..677e1dac6d9f 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -16,8 +16,8 @@ =20 use crate::{ falcon::{ + FalconDmaLoadTarget, // FalconFirmware, - FalconLoadTarget, // }, gpu, num::{ @@ -170,9 +170,9 @@ fn size(&self) -> usize { ((hdr & HDR_SIZE_MASK) >> HDR_SIZE_SHIFT).into_safe_cast() } =20 - fn imem_sec_load_params(&self) -> FalconLoadTarget; - fn imem_ns_load_params(&self) -> Option; - fn dmem_load_params(&self) -> FalconLoadTarget; + fn imem_sec_load_params(&self) -> FalconDmaLoadTarget; + fn imem_ns_load_params(&self) -> Option; + fn dmem_load_params(&self) -> FalconDmaLoadTarget; } =20 impl FalconUCodeDescriptor for FalconUCodeDescV2 { @@ -204,24 +204,24 @@ fn signature_versions(&self) -> u16 { 0 } =20 - fn imem_sec_load_params(&self) -> FalconLoadTarget { - FalconLoadTarget { + fn imem_sec_load_params(&self) -> FalconDmaLoadTarget { + FalconDmaLoadTarget { src_start: 0, dst_start: self.imem_sec_base, len: self.imem_sec_size, } } =20 - fn imem_ns_load_params(&self) -> Option { - Some(FalconLoadTarget { + fn imem_ns_load_params(&self) -> Option { + Some(FalconDmaLoadTarget { src_start: 0, dst_start: self.imem_phys_base, len: self.imem_load_size.checked_sub(self.imem_sec_size)?, }) } =20 - fn dmem_load_params(&self) -> FalconLoadTarget { - FalconLoadTarget { + fn dmem_load_params(&self) -> FalconDmaLoadTarget { + FalconDmaLoadTarget { src_start: self.dmem_offset, dst_start: self.dmem_phys_base, len: self.dmem_load_size, @@ -258,21 +258,21 @@ fn signature_versions(&self) -> u16 { self.signature_versions } =20 - fn imem_sec_load_params(&self) -> FalconLoadTarget { - FalconLoadTarget { + fn imem_sec_load_params(&self) -> FalconDmaLoadTarget { + FalconDmaLoadTarget { src_start: 0, dst_start: self.imem_phys_base, len: self.imem_load_size, } } =20 - fn imem_ns_load_params(&self) -> Option { + fn imem_ns_load_params(&self) -> Option { // Not used on V3 platforms None } =20 - fn dmem_load_params(&self) -> FalconLoadTarget { - FalconLoadTarget { + fn dmem_load_params(&self) -> FalconDmaLoadTarget { + FalconDmaLoadTarget { src_start: self.imem_load_size, dst_start: self.dmem_phys_base, len: self.dmem_load_size, diff --git a/drivers/gpu/nova-core/firmware/booter.rs b/drivers/gpu/nova-co= re/firmware/booter.rs index 2b7166eaf283..c5963f79a08e 100644 --- a/drivers/gpu/nova-core/firmware/booter.rs +++ b/drivers/gpu/nova-core/firmware/booter.rs @@ -18,9 +18,9 @@ sec2::Sec2, Falcon, FalconBromParams, + FalconDmaLoadTarget, // + FalconDmaLoadable, FalconFirmware, - FalconLoadParams, - FalconLoadTarget, // }, firmware::{ BinFirmware, @@ -256,12 +256,12 @@ impl<'a> FirmwareSignature for Booter= Signature<'a> {} /// The `Booter` loader firmware, responsible for loading the GSP. pub(crate) struct BooterFirmware { // Load parameters for Secure `IMEM` falcon memory. - imem_sec_load_target: FalconLoadTarget, + imem_sec_load_target: FalconDmaLoadTarget, // Load parameters for Non-Secure `IMEM` falcon memory, // used only on Turing and GA100 - imem_ns_load_target: Option, + imem_ns_load_target: Option, // Load parameters for `DMEM` falcon memory. - dmem_load_target: FalconLoadTarget, + dmem_load_target: FalconDmaLoadTarget, // BROM falcon parameters. brom_params: FalconBromParams, // Device-mapped firmware image. @@ -370,7 +370,7 @@ pub(crate) fn new( let (imem_sec_dst_start, imem_ns_load_target) =3D if chipset <=3D = Chipset::GA100 { ( app0.offset, - Some(FalconLoadTarget { + Some(FalconDmaLoadTarget { src_start: 0, dst_start: load_hdr.os_code_offset, len: load_hdr.os_code_size, @@ -381,13 +381,13 @@ pub(crate) fn new( }; =20 Ok(Self { - imem_sec_load_target: FalconLoadTarget { + imem_sec_load_target: FalconDmaLoadTarget { src_start: app0.offset, dst_start: imem_sec_dst_start, len: app0.len, }, imem_ns_load_target, - dmem_load_target: FalconLoadTarget { + dmem_load_target: FalconDmaLoadTarget { src_start: load_hdr.os_data_offset, dst_start: 0, len: load_hdr.os_data_size, @@ -398,20 +398,20 @@ pub(crate) fn new( } } =20 -impl FalconLoadParams for BooterFirmware { +impl FalconDmaLoadable for BooterFirmware { fn as_slice(&self) -> &[u8] { self.ucode.0.as_slice() } =20 - fn imem_sec_load_params(&self) -> FalconLoadTarget { + fn imem_sec_load_params(&self) -> FalconDmaLoadTarget { self.imem_sec_load_target.clone() } =20 - fn imem_ns_load_params(&self) -> Option { + fn imem_ns_load_params(&self) -> Option { self.imem_ns_load_target.clone() } =20 - fn dmem_load_params(&self) -> FalconLoadTarget { + fn dmem_load_params(&self) -> FalconDmaLoadTarget { self.dmem_load_target.clone() } =20 diff --git a/drivers/gpu/nova-core/firmware/fwsec.rs b/drivers/gpu/nova-cor= e/firmware/fwsec.rs index 7fff3acdaa73..d5bb7d279fa7 100644 --- a/drivers/gpu/nova-core/firmware/fwsec.rs +++ b/drivers/gpu/nova-core/firmware/fwsec.rs @@ -30,9 +30,9 @@ gsp::Gsp, Falcon, FalconBromParams, + FalconDmaLoadTarget, // + FalconDmaLoadable, FalconFirmware, - FalconLoadParams, - FalconLoadTarget, // }, firmware::{ FalconUCodeDesc, @@ -180,20 +180,20 @@ pub(crate) struct FwsecFirmware { ucode: FirmwareObject, } =20 -impl FalconLoadParams for FwsecFirmware { +impl FalconDmaLoadable for FwsecFirmware { fn as_slice(&self) -> &[u8] { self.ucode.0.as_slice() } =20 - fn imem_sec_load_params(&self) -> FalconLoadTarget { + fn imem_sec_load_params(&self) -> FalconDmaLoadTarget { self.desc.imem_sec_load_params() } =20 - fn imem_ns_load_params(&self) -> Option { + fn imem_ns_load_params(&self) -> Option { self.desc.imem_ns_load_params() } =20 - fn dmem_load_params(&self) -> FalconLoadTarget { + fn dmem_load_params(&self) -> FalconDmaLoadTarget { self.desc.dmem_load_params() } =20 --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010066.outbound.protection.outlook.com [40.93.198.66]) (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 DC36D2BE048; Fri, 6 Mar 2026 04:53:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.66 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772789; cv=fail; b=nX0JhuUUrydr7vIa+rcbv+tuO86kYcZTSD1jvegE4uqkYanSF8xIy+dM1zDVAxy6smb8FxghrXldsJwLRiuo8lvs97l7DkW4dfWLXvPPN8rUQyR7PNfNNpRo0fyu9+9Wq3W6uanWhtyXyf0GmyzvfbwjUE8KEQrI4pg0FcEqN1Q= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772789; c=relaxed/simple; bh=ZMatNdTBp4zkU0aR6MyUgvzfh9scLtSxdFEwiM4MdUc=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=gW+WmHnspf+Miod8YoSC193sHlwuJLAq60Mi5jfqGNs88KAyiv06+ymwu5dDrV4FrY75jMvCUFVcUHYH93zXFrxlzRlGiwZ0DAFRmTgbSc3B5am/rSJ5x8+DFhgjFvk+lSci8lcwNHJBkHZJGtwLvpfroYR+ECFM7vnnFiqMrFc= 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=k9ZCUX+5; arc=fail smtp.client-ip=40.93.198.66 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="k9ZCUX+5" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=BiXfvD/mOb5gYATMYHmHXxJmR36UiI3PEet6Ha3Btal2eq6AS6Y8yvdgj12EJTrw4fjRpiujQOb92jtJfEdfInQ+572WO7A3qAxa01M1ZcNiTMAECsjdziL3Ln84eg7OegK2Lhl6Kpdfpkx5d9tUJzQXSHra1bxd7sgOouykyoMoBrAWrRtKX2N49a1QkKebnV2+i6lruI/f8ZitVxjpuJQqnpY5tnZQISXIvsHih2HukapSKUUB78utJRg6ZWZZaaBovXwb0z2SqcX/z9iasGMo4rrjE5rK72e7kLZnj4ihHt+rn29EM5Trjh/yVt+WZ7kLzIM/eYyD2MaHMiX+0w== 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=x0FrlLKstD7V3MD7Dyhsh+R12xbYsBkvZ6tlBJhfGQE=; b=jg94rqvrLC7oNAYznT2SSOTsATjyMI0VgWo3pkxbB4/3bAeygyTVr8L50nhX70BvEyfzdwSpZzFxNWDXBYBl6EwNRAxFTNhdWMy+rcAfNbvw9od3Bi8ivrTJC0Pp+wzomhmxroN1vki4SInkhh5Rn7WcYC5Ku2ADyLT6zf8IhXGJVJnAgt45QA2aC2bBWKyKQ2mwNiT92tp9CvQu4VxUGccrYH9n/6iCxDSBooxYm35R7YjPlvNiWw0qA4FCJ6YMzM5fwOucbaJX4qPpElP1Z5cGyz7YHIPQEtxoEOVcMMMa+LvFVcpUa7W9vGRlTRJ0VyE/GJEPUfp+JDZz6SeWlg== 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=x0FrlLKstD7V3MD7Dyhsh+R12xbYsBkvZ6tlBJhfGQE=; b=k9ZCUX+5VwW8atWXgzlO5N023riHaQyP7JcwqL27eA+yzk8EBmbHVelqGPMXA00SVXjvPiUgmDO6X0KuEPkDiQUz2Lq+2+qlUD9b3Qgwo7byqZ+tMXFF3dOo16mz5IopS1h2yO4z3k9TGh1LjqxOpp2EtxtXFQ+oMWhCpsC5kZ+5altVk3eCcZQMBFi+Izhhcb2TQn+eaxcEperaWkmF0vY9I00eamAxs1ypTYONUtTUhWsqNSlp/BmiffAwAqOR9tSb1WcTgzqgM1V3wwexyQOSmm4FRMOJFeSFlApfsmjlwoDV3rgKvdO9kv+HHgMvBTCK3JWWg2fYtZKvxZBVkQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by BL3PR12MB6569.namprd12.prod.outlook.com (2603:10b6:208:38c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.5; Fri, 6 Mar 2026 04:53:03 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:53:03 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:41 +0900 Subject: [PATCH v11 04/12] gpu: nova-core: falcon: remove FalconFirmware's dependency on FalconDmaLoadable Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-4-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY1PR01CA0191.jpnprd01.prod.outlook.com (2603:1096:403::21) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|BL3PR12MB6569:EE_ X-MS-Office365-Filtering-Correlation-Id: 8c729fef-4da3-4a93-2833-08de7b3c3fad X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|10070799003|376014; X-Microsoft-Antispam-Message-Info: 8S92rpcbzRuQbt45X0XB2Z+606dzxZlFQ+TGnb2S19fSeQ8oFfei0p/S6eF7yQZq77Fm/5C5xzejEyaE5/uCeFTBgv6zZlyvrDwZFsfmMeWzGzJcl6wmREywHUXwZYRoZTPRLdBU9zWAbfwl0yRpQq2V4GMTLkzwE23fiZJwaUmeMiBhDpu5Tz09RdIune4TPJlUanH7mdp5ptCcIc+Xs9HmwbqFfSAA6Ol2m8iz4oRAveLthQT8L5F33IKnGn9HOUBMFFw+h9LlOhKskz10jVUvN7iJ/Hjk0QjoMBCuM/ZQhB+WNpO8EsMvVvsG0yqxmEvYl4GVaZBYnokcGU36tUrkYtsD8QEE5yC4L/R66AD9kqIAjJz5FRJCUmFeFPbHWVAbtrc5n1S6ODw9n+GiuoFEB1UB3oLcYROVGsasRMdgcPUq387TpzIH7ojWRU6/YE954TTul2Ovq/NTJhCBJicvfwTx7UVBOZxr0AuNWFY55yrtIAQK9+GTYwCA68dLxOaaKgG9/PZ23bNk7fCOz9qr7TGpi6z4o24yCGINeyTaaS6ImMaUF/4QbAtgFWqziVxdW0A/UJUIrJOimahisRO+BLLWOmL2cBWMMQResdwTy5Wkd+q5msvnwdr/75NlzRlqFeSsOatRek9PrKDYAq/cq13X+gDGJvgESQaFiWJoPB68yy8xambLLxdxgw4wyhxZQdb2KBtTnjr8fncCJmil8i00QoFcXUPp/8iEox4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(10070799003)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RmdwRG1jTTZ6cjliREI3a1BBSmdnMFM0VmFGV0ZMcVJ5NGIwckNnb0ZuZGlV?= =?utf-8?B?Mk1WRVlJZDNGR1c0RmZvcTV6ZUtMdWtwNVFMbEF3K09ZQkc0dytPN0MvWloy?= =?utf-8?B?YmViT2NrVGs4RHdxNkM4d2w1eUhZY00rVVFIS2loUWZERDFDbDI1V3BueDh5?= =?utf-8?B?NWU3WEpLTFl0N2xwaUtrY1YzYTJkRE95cVJNVWg0MnYwOGw4UTUxN0ZTYXBi?= =?utf-8?B?N0RJN3pHZlBIbnhWbllsRDlYdjZWeG5PMi8yWlY1TjRJdUhzcXlmbWtvYnla?= =?utf-8?B?alJUOUtYWWw5OFUrTlZ0TkcvcjQ2VDBiclp0S2VtSTBrUElncFhMYU5nMEYx?= =?utf-8?B?aFlxY29TVHVrc3AzbG81QjFmMHppZE54bVNqZWhPalp3aS85SWtRS3RJZW13?= =?utf-8?B?SHVpYUxhaXJUM1I5UXM5Sms2Vnp4TnYzQU9DZlMxdDl1c2RwNENHQ3dFbktr?= =?utf-8?B?T0FMdjRQQ2FmVUZUazZDalVieHFjMW11SjcyZEhUREp3a1IweStLU0hJWFVj?= =?utf-8?B?V2NQaU9OanM0WTk0ZERjNmZtdXBGR2U2NXhRV0NyRzR4eHdScUVQWmJHNmM1?= =?utf-8?B?OWRhTXIreVRJZkZDZm5hOVQ1U3NpVXlKUVAvRTlmV1BodWM1T0ZuWkhXTzRV?= =?utf-8?B?Mkp1SVZNcUVYWE0vamhidkVJNVNSQk04bnM2V3V5a09BdlNaYXlPNkFZRTFU?= =?utf-8?B?WjEzYzdBcnV6WVFRZGloUjNZeDBSbFFNYmtZWE1nMEM4Q3NTeGNkaTN2YnRl?= =?utf-8?B?TG12WmJ3UFZraXpST05CdGpkUDJ3THZEUlBUZWFRT0VtNXJEM0o4aitZNlBM?= =?utf-8?B?ZFVJU2RKbmUzYmh5ZEpTdDVLa1lrTzIwUDlkQnZ6dUFHS2xZOW5Fb0gwZ1pY?= =?utf-8?B?VUVGQXVJeFdIVjVrdXQvMW5DSUNnRlZIVUJnZUdnaFlFeFZqREh2SmFIMzg5?= =?utf-8?B?ZTZCUi9Cd1BZdlFpclhnT0Y2MnNHcnFwMnFlNTJxZnk1YkphUzN2Tko3ZUh0?= =?utf-8?B?RElyWW91Ri9HR1hNcDlJa2dIZEFSV2ZnVzkxejFuTTZjOXF2bE5oSi9jWnNJ?= =?utf-8?B?YVl2UERWVjZ6cmJKRmtvMURKclppSFQ4MldncDZKclhiMkJPd2pualUvbHhJ?= =?utf-8?B?dmcwTGlHVjNSYU9BT3BHZFJmOWZlb1hFY1BvK0lhbnJSc09mdVRrd1AyNDhr?= =?utf-8?B?SzFiVkJrL1RJY0d1SlR1RUpGWVh3WUFaeHVlVW5WWE8xYlVTN1dJM3NOd2Iv?= =?utf-8?B?M2lZTDBlZ3VUZHY3dUN2dWtHTXljSlY1TzkwRGNRTnJHVm5iVUNJQzNzVC9t?= =?utf-8?B?djRSc1gwbEZ0cU9tR3dISFhOa0JDQXJEdlBrRGJmeVZqS2dtRldXZjJOcVVG?= =?utf-8?B?b0hWU1VTNEZXa25Ya2ZFYTVvT2wwNkUwQkNQTXFaMGtBRGdZc1hsNGYzRk5Y?= =?utf-8?B?ektqSGt5Vnh1VGFxTEFuNTF3OXh1OHNEdk5PT0ljbldlbjQ4S3BXU1RWWExI?= =?utf-8?B?ZDZOdlFqc0tVaGJCQjFmNmJlRnFDWFh4UFdXRWZ6K2FFQnliM0VWVW9EeS9q?= =?utf-8?B?YmlLMTBCYmxMRDkxU3pxQk1OZGlrUTlzQ09zbTZFZE1nSlUvL1ZlNmZlL1NK?= =?utf-8?B?bUwvMXVsRlU2bDc2UDBLeEVoMytsTUtCTXljaDRlUFhJK21YdWNmdEY5enc4?= =?utf-8?B?cGhHdXFaUEZCbTdQODhFNXBaY095Nm1NYU5FUFd4b0lxZFA2SDlkeG55TzFn?= =?utf-8?B?dEZmY3o5Q1hNV0lmbXo4OXBWSzhZNlRPcHVnRnZhczdBV3h3akZnVmV0ckdG?= =?utf-8?B?MmJrMjJGTGh1WDBxRWVpanQ1L0N0UVBCekgvSE1IR2VPQmVDbC9wYSszMlhX?= =?utf-8?B?Y1NWR2dCZWg4ZHEyUFBEN2NjbDVPM0hiSi9lVWxJZ25ZK25WcEVoaStiY2tL?= =?utf-8?B?ZmlSY1JTUTBOekJQOHRtQWZkL2F6U0VaT0xYMnkzVTEwbU5KZGdkcHQ0V0g1?= =?utf-8?B?Q2tMeVJFaU1Hc0xYVHJ5V2JBajZnSStXb2lsUkkyYXkyRERvYUM5Uk9icDUw?= =?utf-8?B?dkdldm9ZQ1pvRVY0N1ZWVTA5cUtlNzhhbk9URWZSSUZydGNwNVltRlRKYTZW?= =?utf-8?B?WW9na0paMGhiMWdMeW1lU1NQM1pkTEpYNytjRHd4MFJZeG1MY0gxMFIrMU5L?= =?utf-8?B?b3VVRUNGS3cvMHJzcW8xemVqckhjK2JmVmtTSlI1T0RtdkRVQkRlYXVhd1dH?= =?utf-8?B?bnRTM2M2Yk1wY3M5QjBiK3ZUd2pIZVZ0NWtmejBwYUgzMmpTU2QrMzBvaXNQ?= =?utf-8?B?cFBDYytEYTJMNGl6WHhyV0tKMmkzMG9JL0d1QWpKQXE4RTlwUXBMeS9DQms5?= =?utf-8?Q?ZG1zRxDCg76u1aqAGfYZyKsyUVxP7+rxdaMuUh+ptKm7c?= X-MS-Exchange-AntiSpam-MessageData-1: i7jEpyvsmgY6Iw== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 8c729fef-4da3-4a93-2833-08de7b3c3fad X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:53:03.1351 (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: Mi/QhskMDfhMr4bL/5DYYs5ILHuN2XzgVJ6Y4muI1PAC4E8fRICTgohEuW7jrgPqgXrYDK7apCwN+SSQwX+6ow== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR12MB6569 Not all firmware is necessarily loaded by DMA. Remove the requirement for `FalconFirmware` to implement `FalconDmaLoadable`, and adapt `Falcon`'s methods constraints accordingly. Reviewed-by: Eliot Courtney Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/falcon.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 9eb827477e5e..450431804e1c 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -378,7 +378,7 @@ pub(crate) trait FalconDmaLoadable { /// Trait for a falcon firmware. /// /// A falcon firmware can be loaded on a given engine. -pub(crate) trait FalconFirmware: FalconDmaLoadable { +pub(crate) trait FalconFirmware { /// Engine on which this firmware is to be loaded. type Target: FalconEngine; } @@ -521,7 +521,7 @@ fn dma_wr( } =20 /// Perform a DMA load into `IMEM` and `DMEM` of `fw`, and prepare the= falcon to run it. - fn dma_load>( + fn dma_load + FalconDmaLoadable>( &self, dev: &Device, bar: &Bar0, @@ -660,7 +660,7 @@ pub(crate) fn is_riscv_active(&self, bar: &Bar0) -> boo= l { } =20 // Load a firmware image into Falcon memory - pub(crate) fn load>( + pub(crate) fn load + FalconDmaLoadable= >( &self, dev: &Device, bar: &Bar0, --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from BL2PR02CU003.outbound.protection.outlook.com (mail-eastusazon11011048.outbound.protection.outlook.com [52.101.52.48]) (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 9BF1A29BD91; Fri, 6 Mar 2026 04:53:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.52.48 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772793; cv=fail; b=E5IZ079L1BSSO5b8lPGJJfrUncKbnsT4h3O2WToSA+OG1PTZhQ5AiMJHkqybOPDIQP/bQ12EuDT/e8mZ2x4nDI0Q4+vnSCthb9HgloBNiBsv+M5vYPC50cHftiCMIb0qtI7cN9KItfbMJVFCfUtR9Z85pI5m3KlwlwXLnSnOYEU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772793; c=relaxed/simple; bh=i6kI4KDH2z81qENgkZPpAoW7uVPIZiKbHFGonC+fV4w=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=Yj5NUZu/cxYhPXMYy02VYnsJeCb5bRkD0eLQCbjURRfSWUw6t6jpuiwaoplzaS7ZH3my7EwGMtpWkrsDClA+pU7NvrS+qSKJ5doG4f09s8sM4JhCExo3D31ugmPaJYmpBChZVWITGCwgm6hjcZapnR+/wb5VhXtszWdjWnhUcq0= 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=m+goh4er; arc=fail smtp.client-ip=52.101.52.48 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="m+goh4er" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=bgEgsUmEROn2zQnz1l5n/QbFyz7PQ2kvjt6uR7IiwEqEq8mVq7tnoint/BNmHn7f4FnZrNx3uT2MJm7DffBYShq1LTj6+ieyCtQKrdePLVU79dQQLXtzFKpvSAWzHY8o7ni59pa4yG/oe17Z5CY0zMpHVDUVTDG9fZDTyAM5XrywOkQbyFYy3XDUjOPaiCwZQLa0RwM8ITfnV5Y64lygiWO73n1SbsR4774Qrqt3kIgmTu/wzUhTTN19rmIKahZOnNCRHOOGcjqgDGuho0R/wispCwCTpwUaxr5QinIEcJUMt3Fbwl3a7iTirAoDpJZiB7KWvGHmjgpuOckD5OG3gA== 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=BX6DDh/wZrB34iiwGQ13gVJkVFsoaIv4ts9A0+ZlAnE=; b=VSflrpxE1GNqeVPJGGU3rt84nv0tkGqt6phppDwl+54O0FWkBlXXmxLm1zdjuRmY4TAcz/KBmGeWfbUT3wPVFNlcX4/20Jy8dePrNv7LinAgoJAGOOaNSCFC7OgtXlrLyBkwN2GSoVpTbyt7QW29oWnE6y5wCcNjseTIrCn9zL8dBcG/IpBN+JGoECjQjIV3QB3xoaLDrqs7MOrlVaOiWMYjRs+iziQ7vjqabjxM/GfdItl2c8ZtxVcpPbKGJ8dE8fcwKp7TZc/HcacKJkJsOPCTknW+E884FnhOxVNloUqoIjTxs1qSLaQ9S+HvNO2IjTDP4xlbr2OtPwf5sdalKA== 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=BX6DDh/wZrB34iiwGQ13gVJkVFsoaIv4ts9A0+ZlAnE=; b=m+goh4eruoz6n74Ng8tM2FB/QNfH7Gwz3fyF81cGUfBDHZas9jdGw/yZKFXMGG+I24xi5fLL15kLhtzJhEu6Kww7PUTXYDqSltVsF5JAknb+LgJQR4T0PGvJGeAARW7K4ZYqqt1n6mYxU2xAczWyZjMO0loNCG1ahtEqY1SV0M6qJz/rKdHs9nWAy/J6yM7j9mM0T07989jnx6vBvLYDQEAZOTdNPu4LfpKYQf+BxZ+KraHnMaJ7NYH8T1eiMtYx3NZBpUjvi3T3eVGaRKG7N2w2t+ij0VoF3oAySi8xBKZlf8KiuwdqxrNdhI2zPseb6yXP1aMtHSJgUAteD5cuCw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by BL3PR12MB6569.namprd12.prod.outlook.com (2603:10b6:208:38c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.5; Fri, 6 Mar 2026 04:53:07 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:53:07 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:42 +0900 Subject: [PATCH v11 05/12] gpu: nova-core: move brom_params and boot_addr to FalconFirmware Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-5-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYCPR01CA0020.jpnprd01.prod.outlook.com (2603:1096:405::32) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|BL3PR12MB6569:EE_ X-MS-Office365-Filtering-Correlation-Id: 323396cb-c000-44cb-9288-08de7b3c41f3 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|10070799003|376014; X-Microsoft-Antispam-Message-Info: /iELLkiyqhNCSpgpc7g6x51sYIY3sqZdWph7weatrNuGDlNaoTi/cH/zfONDHlDl0U6spYXmf/TkSY4sJPbp049w8FQV14QwhE98muF0KZnjQBQlGbkNuRCxX9hQ0PMoIMYHxcyprbZBfeME3ZW8fzVFs9ohBoxtlb79ulfiXohjDjWEQC0YEuYVxo4W63tbIKP4NVOG58nt/bXd64Yj/pC/V0AcbbX8UT+h16aHxLi0Ej9SNA76OyuUHaz0qbPx59Yv8SO4B5tfS9efBgHwwyKTby4UJ5nQpTTdh8Yk9dGVNjNAyIssq//tZzv3KMVlY5B7v6naeE2e2wH9mKiZG3p8FoYeItONOfeP0XFWmAEQhVb9vLGecF8jnK4uzfBcYNkb6PA3jQggV4dQ1I8GT9E+dhbZ3zym0FlKC0XBrrgQ0sOn8GbPE2lNqatvxS3CxB86DRXvZO3JJpRd4s0vFlKHAx5NI//vLGuZ0fWks8hqXOq+bXqH87+FLBzUqRsQMYzZcgrsh3YuhOE/Lo43Ef9s4F4hC3jrT4AYwGSacEcoqseD1M6zDH2o/1RejK8S9YOdiGz0dC+6/SGvczyOVuhKZbFY5J8JNSQp5+Q7kNE99NfoKiBEPkVjJiWimfN/VNCrhmNNOSkrmijcsGmwlC/89thqPy+uzAA/CAgoyls3AVG2ngQ7fdho8s2TBeGuJdX+PKJilwVgexI7nptyYwx62rhWh0A2UahGZa1447Q= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(10070799003)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?ZlNUV2hFUzdWZVROSzFVMXllV3JXT3EzYzdNeThGWWlLWWRRTkYrbDV2Skhu?= =?utf-8?B?MzJiUisxM1JGakR3Y1BzTnRMblEvUURSc2xyNEk2SC9BY2UyMjlhakdMbE03?= =?utf-8?B?WGExcU5rUFZoNWtqckR2UElna2JLaG9USHM2NEhoUnkveUxXbDJqZ3N4UkJZ?= =?utf-8?B?WHpzaWQrZmI0akozd3M0ZEFnNzl4b1pCOHZHMzRYMTA0Rk5vR3cvYlNTRWx4?= =?utf-8?B?MTNIbTI5QnZFbW5GNlhCdmV2Z1ROTlBXY0Y3c1V1TlNtdFNWSFBFTnVPRzZI?= =?utf-8?B?SlUvVGZNcjhxMDUyd1pNZmNpZHhWbk1NYkxQTTFMOThkdVBKa2gxZVJ6VTBu?= =?utf-8?B?VFZOY2hzcXF5TWtxdHhmZzl4WHFCODhOaWQ5dzE2MFZGRzRISzBUTzZUVkJB?= =?utf-8?B?bUZodVUzdGpOc2QxVGk0UHJTRTFMSFI5L2xZbVJJR244SjZyclVvQzNGTW9Q?= =?utf-8?B?U29sVklWV0dTUlBwbzRvM1Mvc1hsTHUvNjZLUTJCYS84MnpHb0tUUzlac05P?= =?utf-8?B?SGhsYStrMy9NRVJWRm9nK0tqSXE0L2hJa0NZekU3aE00M3VlNTZnVTUxcXk5?= =?utf-8?B?MmZOZFA0R3hEVUdlb0FkZCtRSnJseEltVWVtaGNwOE1uRTQ2WlF5YzVveUZB?= =?utf-8?B?OXZIOTdvdkRpVVk1cDVLM2ZiSVd3R2pRTTlQdlFEbm9aem9mTWRmR1Q4cDZy?= =?utf-8?B?YlVwaS9SVXBLcTVUSjV4YkkwNE81Qm93Q2toanNBbDdhbHJ6WnJWK2xGYU1M?= =?utf-8?B?T0NOWmNnc0dhNlhxaUE3UUdlNnFnQ05PWWRSQmQxdFU2RXRwc3JudWxHRUVW?= =?utf-8?B?eUJRZlJhdWI1TjdrbElpbVNSaEE2alMySmNNL2RZeHZIRFNRNTBjQVQxUllu?= =?utf-8?B?ZE9pOFllVXpnME9Xd3JOSFNCVDZtWW4xeFBrRmtadGJBSlVtazlpNjdUMFoz?= =?utf-8?B?OXZMV3FIb2NTY2ozdzhMQThtYjNsQVVPQmhMUGVBaE1weW9MaXluVjhnQ01a?= =?utf-8?B?aUgzQWVuM3QrMnY1cnBFSk5JaE5NNnZBL3BVb0dxbUVHSFQ1azdiRlJUckVD?= =?utf-8?B?QzNrb3M1Qk1JSzFVTGozZ2F6SFNnQ0pQRHdpWjN1a0EzRnJEZk5MZWdSVmlp?= =?utf-8?B?VDQ5ZjEwaUtuanloNlZkQmE0SjVVTWIyby9qY2FWNWNjcW9KMlRsTllSaHM0?= =?utf-8?B?NFdvN2Y1Q0NhZGZFbEF6VDJsbzRhK29zeCt4R3NrQ0cwVWEwZEpCQWhvbVM1?= =?utf-8?B?UzRZWDlmZGZqUG1Db0o4bWgxdHVUbjNVNkpBRlJ0ZzhoMnBtRWdkeE9tbThQ?= =?utf-8?B?cjBrUWE4bHp0R0ZvcEZLRlZZMXJmNnRycEdPT0ZNNEZXWHpxTkVlSDY3TGN3?= =?utf-8?B?QVN6b3VPZUlsVXFWQ1RFMnpteXVMWFNUaHFzbkxmL1Y3QmFIRGRLbkxmQXRk?= =?utf-8?B?UzhxSUcvUVROTk00V0dPeHVoam5XT0wvajZNc05PeGtkSW9aZnIybm9nN0w4?= =?utf-8?B?ME1ITHpPbkRTOExXQ1gzYTdzamN1TVZETTB6b3AxRjY2aXF3c2ljUWF6bW12?= =?utf-8?B?bllxMllVWlJnb1NIYThmOC9mdlVEV25MNFpjbmJFdkF3YjFZTWp5bW1ybXpr?= =?utf-8?B?dFB5Q3pVTjJ2MEdibEJFdnM3ekxOaEp4UmF2Z1ZRM0xaTWNKTzAxelBzZnpM?= =?utf-8?B?RGtRNjg5WWw5clN2MGtSZHA3U3duNE9USXkwd3FvSk85Zk5QMUFCUHNzR2JK?= =?utf-8?B?cFlqek5yUk5VYVpJMEhsS0dXakpTSGRHQXFSRGF6czFKUEtsYlA1emY0a2Na?= =?utf-8?B?RzRhWnJuc2szRlF5eURsbXQ4bG9QdFpEZzR6QTQ4cGpIeE53WEFGVVIwdHpp?= =?utf-8?B?dUJveGVXNlBZdm53ZFYyWUYrdTR5VnczblNMeisxZThhV2c3c3NCWWM3aHFU?= =?utf-8?B?UVhmd09EYnhnV0R6NnJjbENxbVBJeU81L3hKYzZTdGZqcE45TzM3TisydEdQ?= =?utf-8?B?eWZ5OGkxVDh4NUYyZUVmOTJ5bWliZmpmZG5NYTJ3NFo0VGxodVBJKzB5M00r?= =?utf-8?B?Yys1UUxkeEQrbGlNWEZvV1A2RURUTWpnb3dXM1RDZ0ZVRS9zRU9CMlNIeTNR?= =?utf-8?B?UWJoUGwrMHNsQldaR3Q0enIvS3p0bFpZN1MzMXRDZzZHclhpSG4wQnNqdTdo?= =?utf-8?B?YXRjcDhFSVBaWDM0RDBDRHVaaU1ncTgxLzJ3OVVDT1VLRnp2SGNFT2d3a2Va?= =?utf-8?B?d3VUNC9tTndEcm1RcWtPVW1iZHYyL3BwM1lWWFE0UHptdGh4WlVRNGh3SXNr?= =?utf-8?B?QlRHL0w1d3NlZlBFaWdVLzBwMERjRUJuWU5tei9qNC9LQ0VueGI3dXRWQ0ZN?= =?utf-8?Q?NwgxAM/hQoYL6n0x7l46ZCPIrsqKd8cKWLNd7X/eiePRC?= X-MS-Exchange-AntiSpam-MessageData-1: 6k+kTBxGBOzCug== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 323396cb-c000-44cb-9288-08de7b3c41f3 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:53:06.9172 (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: ihNTmRmjCebNOliHb3w3jEopd8g9VPw7nh/KNnwp1lzX1PA4W1PCh0lo1pEttvwIrnftkvwyyXQOT+dVjNpKgg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR12MB6569 These methods are relevant no matter the loading method used, thus move them to the common `FalconFirmware` trait. Reviewed-by: Eliot Courtney Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/falcon.rs | 12 ++++++------ drivers/gpu/nova-core/firmware/booter.rs | 8 ++++---- drivers/gpu/nova-core/firmware/fwsec.rs | 8 ++++---- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 450431804e1c..c90664efb0c5 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -367,12 +367,6 @@ pub(crate) trait FalconDmaLoadable { =20 /// Returns the load parameters for `DMEM`. fn dmem_load_params(&self) -> FalconDmaLoadTarget; - - /// Returns the parameters to write into the BROM registers. - fn brom_params(&self) -> FalconBromParams; - - /// Returns the start address of the firmware. - fn boot_addr(&self) -> u32; } =20 /// Trait for a falcon firmware. @@ -381,6 +375,12 @@ pub(crate) trait FalconDmaLoadable { pub(crate) trait FalconFirmware { /// Engine on which this firmware is to be loaded. type Target: FalconEngine; + + /// Returns the parameters to write into the BROM registers. + fn brom_params(&self) -> FalconBromParams; + + /// Returns the start address of the firmware. + fn boot_addr(&self) -> u32; } =20 /// Contains the base parameters common to all Falcon instances. diff --git a/drivers/gpu/nova-core/firmware/booter.rs b/drivers/gpu/nova-co= re/firmware/booter.rs index c5963f79a08e..2dccbdd1b558 100644 --- a/drivers/gpu/nova-core/firmware/booter.rs +++ b/drivers/gpu/nova-core/firmware/booter.rs @@ -414,6 +414,10 @@ fn imem_ns_load_params(&self) -> Option { fn dmem_load_params(&self) -> FalconDmaLoadTarget { self.dmem_load_target.clone() } +} + +impl FalconFirmware for BooterFirmware { + type Target =3D Sec2; =20 fn brom_params(&self) -> FalconBromParams { self.brom_params.clone() @@ -427,7 +431,3 @@ fn boot_addr(&self) -> u32 { } } } - -impl FalconFirmware for BooterFirmware { - type Target =3D Sec2; -} diff --git a/drivers/gpu/nova-core/firmware/fwsec.rs b/drivers/gpu/nova-cor= e/firmware/fwsec.rs index d5bb7d279fa7..87495d1d6cac 100644 --- a/drivers/gpu/nova-core/firmware/fwsec.rs +++ b/drivers/gpu/nova-core/firmware/fwsec.rs @@ -196,6 +196,10 @@ fn imem_ns_load_params(&self) -> Option { fn dmem_load_params(&self) -> FalconDmaLoadTarget { self.desc.dmem_load_params() } +} + +impl FalconFirmware for FwsecFirmware { + type Target =3D Gsp; =20 fn brom_params(&self) -> FalconBromParams { FalconBromParams { @@ -210,10 +214,6 @@ fn boot_addr(&self) -> u32 { } } =20 -impl FalconFirmware for FwsecFirmware { - type Target =3D Gsp; -} - impl FirmwareObject { fn new_fwsec(bios: &Vbios, cmd: FwsecCommand) -> Result { let desc =3D bios.fwsec_image().header()?; --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013034.outbound.protection.outlook.com [40.107.201.34]) (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 6CB5027A92E; Fri, 6 Mar 2026 04:53:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.34 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772799; cv=fail; b=jG5nOdROxnEV474vDWPYsUxlumY3czD7yNdkEgWZCIEKbV7Ofv69u6YNhksgeGy7TqxwG/WM4vQPXlkt/IuVcQElH2wr/xFhQmLv0dF0BTRUvDwUa9Bzp5J69JpDnZVWrpyP9hWxOhmfgOE+fcpgeoWYkZuM7UC2P0jTVk0cU9c= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772799; c=relaxed/simple; bh=a0nNwXEQPCaLuRH9HrhPAZvnAxCGUVgjHamhl09w4lY=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=KM8L3LyhAkbkSO3Z6Q79YxBsYxjk8AL5bOQbCev/pq02Y0tnHNZeEmdelDhIiIymza+Y9Qcso+yvMgxetlwpjIct5jGZ3Cy0ObGIJdEEMW4Hli/wHgGeEhw/eVg8u9m5wx3gVETcKlT42WoOwU7F5O0mtVTBDdHuUctz5q3HuHs= 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=MJIyg9o9; arc=fail smtp.client-ip=40.107.201.34 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="MJIyg9o9" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=i6UOdtflf8ozT4e49+RdH1qGGwcLwwqQpT31IE+b5XZbiPFCil5VBncww+VlhoYktmymZghRoU3Lk5TTe6C2NTdoGCTyEeAVmGA8YSmcvf/bVyq4OlsA4Vm6c73o9tsbBkqJLNGlfThBveiCvN+dDg2m0EUxOrcSbiY8/bRFrJCDwOkFPrhN/kVpaKl9PYWdWhFEK2NZoS9lslFb6mJLqw4hh6qcpYO1QxBilWEgu+z+4fYzbiwGsbmmI79C2EKZg8TuhK1SDlkjnrO8Gqd58AHEqXm6lvMw78ABQnq481eWDnO/P9l49+la2gfTBFc+XYnUI7BfQK64+B93xKKOpA== 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=N+yevuLUzZueZT69xleERw9YggNLeISxFyntNxY3KYs=; b=K81vx8YkNwYwXqxvQUmoG5V9ScsBdu44hc2gFT/ZxpTCSNXU71HYor35mIilJRne5Rd6UQxh+c7Okfl4fI6UYUmKwP2E7ghQAL3GTrtDydHBuB//SMi3lA8E5gquBebLTrbNfW0gZDBrPF4R1sM4RZ2XNxbIOcZuNF2iNBI4hy/Bgn/3+sIN7jVdXMHFYO76Ws078HYgPsoSxl8cr1YZV1WEH+sdk5rnfD+HS5zNzFwCZ3BxgWFb7bzaw8BazLfBGM8B1t+v6LWzee3PpdthL6pdM/bsUdzDeGx42oRd6h8u9xobIDM97im4tMjAiEsUN3oUiRnEblJV0ST7t2p2GQ== 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=N+yevuLUzZueZT69xleERw9YggNLeISxFyntNxY3KYs=; b=MJIyg9o9fAYMOU9cBtl5vTn62bgyhSZox41rBUvC5fyuVFsXQZcM7j+yZQV04ci2cvpQG3S61gW3HwLTK8E26IC6Np/HNfaVO1f/im2ARc9XSKFQGuovPfFD2QWHCiucFumDW1/BFSD2ebDU99yW2ZqNWtAjN07xVN1AAmvutVYEo2NbzP7U7Vvc2MzNxx3kWH+54EloWZSOGjkm7gH2Dzx6tEk/tMV+8cPJnBU5kooZLBsafvGlWFzmyYJOavMCuuvog/0hvyNuIcy0RGn/Cvnym3oT3x7mHlJB8eSbZVJDDKrA0njNKqGXZzuN7UbgEUCBfISxKKcPkRJILsKt9Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by BL3PR12MB6569.namprd12.prod.outlook.com (2603:10b6:208:38c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.5; Fri, 6 Mar 2026 04:53:11 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:53:10 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:43 +0900 Subject: [PATCH v11 06/12] gpu: nova-core: add PIO support for loading firmware images Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-6-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4P286CA0017.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:2b0::19) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|BL3PR12MB6569:EE_ X-MS-Office365-Filtering-Correlation-Id: 6d2437a9-f091-4ad5-7a6b-08de7b3c4431 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|10070799003|376014; X-Microsoft-Antispam-Message-Info: EbdIns4aZEXXOStSotN+DcNcFaZwx38doGtZkW2pGZyndfUBSCOA9hOoObngxTKaQc6YKCdpfRdLDGGNVdo1n9lmbMwR110mrQGJCPUiYu0tjmUTw+1xCjwratP/yTmc/CZ9R6TG6Fs39jJxUyMhOUx+slcVbaNY8Yu9CmWQ3cO/37GCXd/hxPJ1otdAOBa0hIRMggrbcAWfBYW4cL1+I1fDWgN3Kjq2YWvshdswR3R0404FGh/qGjWASRJt4Jy7h7sC6cbOOK0nU+hnwlwJHPpRyjd/Nu65LcUJrY6RWKXpDhBoDM6sm7PLb7YQ2fBn3lrsVgfOEgeM/EoV8V8lgbzr2qpYoF3NR/IAAd1QnvfmJgT5LDBRghao0C3uc8t8vezZA9w7OyfhQpn5JYNXs2HVCXO4+bHHrcCGbYKp/qnL+b77/tv1mlH2YBNhKA3f54fy4wX8taT/4r13UosDstwXyi5TB33mGwsnwzI3GR2KAjHkBaDYeGZ14nzE2JNgbsr5X7d4l0iaQRtfGOrkLp91iNuGmkucj/IkBrgbFB+GkToMLZ8mbHu2ukMYe3cgiPNoGAsgn4PXh4yM9fw2Y40uhLacM6NYO+BxaAriyCYU5SwH4/moINJXlTtydRNmUA4v6iZB+fDVAHMp5Tz3Qwu19dsRgf8O8xe11Qd+tWexzisThtaGSWOgL8AjAtjW3jr1EAXJNi2blBuSI4hhlXGGx9YOko6zQEcOeBGoaOc= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(10070799003)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bzhtalRNanVQRGVST0tWYnVDSDgvYVFEZXdQSjlxNXcxOURRWTMxL1V5MWZ3?= =?utf-8?B?YUM5enpJRjlnODBVek53RlF5NkNJeW1Mb3VQTHMrSy9mZ3BWNlVFYjlPUWw1?= =?utf-8?B?OWFkSUlBZmlUL05lVm5YcnRCQkwvK1c1YTF2Z0pQVGNNUStCcVRYNnZOVk9r?= =?utf-8?B?UUd3WHg4OG9HcTFscmVITW5UMERqLzFQSnhuVEF1dlJObkVlRnA5OXdpUDNQ?= =?utf-8?B?L3Ird1l0M0l1dWkrNmx3ak1UQmQxd3UvVjJBUHNnQnNyVS9mdHVtWm8yVFIv?= =?utf-8?B?a0pLNGh6NEZoSEFkMjlGTDRGLzJhMmh1OXdIeE9iaHFvVkM4N2xxd3ZFeUtx?= =?utf-8?B?QmUyME4rd3NIT0NHdm15U05JOFIzaFBPTkxKaEUrWjI2TTVscEFJL2pldlRr?= =?utf-8?B?UlBUWGVuU29IYVNmZ0ZpNWNEMFVuUFNWQ1doNHdHbE9lOStEM1BxS3VxbHRL?= =?utf-8?B?a2JSNE1Nd2RZL0VLK0RTT01VRUdndll0dlY0YjN4N0xsckZ1NHJoWmQ4SlBu?= =?utf-8?B?MzRxMThlUDRydW4xYTR3cXlqSk9PNGY5SDRGaFNYZU1MYU9ZSmNsUUYrZ0pn?= =?utf-8?B?M21ETEpycnlQTFZENnRXRnZURzhOWThuQnp1Sk5iUmZxRFBBeERJN251Vkth?= =?utf-8?B?WFROSGpUdS9BeHpHT3ozeHBxT1V6bmgzZEhMa1lZcXd0QUJvRHFuSmpackp2?= =?utf-8?B?WFdUSkJKSU1XUEpaOHhKcS9EOE1rMDVOYzA4QTZMbnlWc3pBN1k4Y3lrMWFS?= =?utf-8?B?MWFTNWNhMG02UTBUdnhVNjAydzBqdmdDbEtkYnJXY0pqbjlOT09tTmt3OFZk?= =?utf-8?B?bURqQTI5NUlnZm1ZTiszZElYVktrTS94bTU3WTlmR0RsbkYycU1lNkZNRFQz?= =?utf-8?B?czBNd2w0Rkk1ejZnTjV1ejErMUtESjdUUWc4a2h0TmpnNG52aDZtT3V3SzZu?= =?utf-8?B?VEFhV2FzMzZ0WlJRRVhLNUltVXFqait0d0EycHE4L1B6ZTZlaUxmRjRPSGZz?= =?utf-8?B?cmh2OEN5b0tWeEpMenViRENxYjBiaEF2WG8vWWp6bUtzTVJ0T01rYWI1Yk1h?= =?utf-8?B?YTNOcjJua0RUaUF1amd2cTJaQXl2NGh3U2tZMzMzY3YyeXczSTFkTGdRbWcz?= =?utf-8?B?MUVVYVFQblB1TW02QjRvdUloUmNCYjhyN2dhWmRJTlp1aEFIQWk3cUE5K01V?= =?utf-8?B?N0t4MllMcStwTXFiOWpENzVGOUU5Y3JtVGQ1Z3BSNTRCZXNSZWcvSkY0SWxz?= =?utf-8?B?VTdVRWxWWGFWUDJ6NnZ2MlpRenQxT3MyNi9jYlp0Z2NlWXJOTmxSRCtZT0x1?= =?utf-8?B?V1BocXJYWlZ2L3QrenZla1lXRytvZHlvMUdNUnhLS3RKOTFoY1ZXOW5vZ1cv?= =?utf-8?B?aDk3TmVISE5tRXJZMWcyUW9SeFZMcm9jZ3dsVXVFZm5hcHc2S0dyMnE0Njg4?= =?utf-8?B?bEh6d3I4L1g3UHB6ZlpQTEJPdEZLRGo2SzljaGJmNjRlWkhMVk4vVkpZN2E5?= =?utf-8?B?K2FsTml2bTBZV20xOXdSanF4ZHNGbURnbWlSMWFhSEx1ZUY5RW1qSHVQSUY5?= =?utf-8?B?cllYeWwxNjE1eHdIWDV3ZW45M3BJOEhrWTdjYkJ1RndsTGFwUkU2R2tveXNn?= =?utf-8?B?ck1JVkhQc2cvcUFCNXlHUEYyVnI4RDV0bG92U1hsdVI5MmtWanJSbWwxZXRD?= =?utf-8?B?NDhCYnY1OUlYMU1wbzVtNGtWZVJDNGxBSkgyeWowaVNZRHhORHRueGd1L3VL?= =?utf-8?B?ZXRLMnQxeHU2S09PMVkvT2trc2gvWFlyWEFEcXN5dWRHcWxKVGVETkN6UWhU?= =?utf-8?B?OFdqNEJ2eEFRdDBVWFAzNFNEU0F0ZVo1anQvTkxycGhha1RSbk1UYzdTNEV2?= =?utf-8?B?TU1LYmhWSkExSk53RUloSlo5dHNLZEJNditWN2xoTExVdjYrWm54VXd5bTZE?= =?utf-8?B?cjRLcUc4MnhvbUIwRk5NYTFMeTFiTUUwZUFWaElHeURJUkdpN0c0S0NISXZG?= =?utf-8?B?NXhnL1g5UXB4NnRQU3liUWFEclBsM2k4ODhGOTdtK1RHWW00R0k2eGZmVmVx?= =?utf-8?B?OTNvbE9tVGpaeE84enVrRkJEMldJM2JDWmNPZlI3bEZDSk9keTdRSE9mVjk3?= =?utf-8?B?bXRNa09mSG91MVdtWEQ2N0dOaEVTMkR1bktsbDAzczNuMXBPdFFyNCtvb3hQ?= =?utf-8?B?a1JTUDdwcDNzaGJ6c0hrTlJpU3RsVktNNHpLdS8vSjZGamZuSDY3RUlWZWdz?= =?utf-8?B?YWdpNW9PaVhSQlJnWHJySWozSjFOdFZNVjdzeWl3aVJRSDJ0RXczK3BCR3RU?= =?utf-8?B?amtDWVZSL1JFMGhCT3NvVnNJR3BpaWViN1l2VzNLcHJHTUJJbkVvRWxXQzlF?= =?utf-8?Q?x7LZV/A4v+PPDORzaM+0bIU4rdxWN6qci6aIVUbJJU1yo?= X-MS-Exchange-AntiSpam-MessageData-1: i8b1CpOIGLLdMA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6d2437a9-f091-4ad5-7a6b-08de7b3c4431 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:53:10.9039 (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: NYzMm9fK85XSkNepkEt8l7JQteQXyqGnvEl/xsIRx3BeOWKM+gMhByBVGmwi5FcCYYETqqwuJlTEW9RgU5qntA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR12MB6569 From: Timur Tabi Turing and GA100 use programmed I/O (PIO) instead of DMA to upload firmware images into Falcon memory. Signed-off-by: Timur Tabi Co-developed-by: Alexandre Courbot Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/falcon.rs | 218 ++++++++++++++++++++++++++++++++= +++- drivers/gpu/nova-core/falcon/hal.rs | 6 +- drivers/gpu/nova-core/regs.rs | 30 +++++ 3 files changed, 251 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index c90664efb0c5..2168ef2c5148 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -367,6 +367,127 @@ pub(crate) trait FalconDmaLoadable { =20 /// Returns the load parameters for `DMEM`. fn dmem_load_params(&self) -> FalconDmaLoadTarget; + + /// Returns an adapter that provides the required parameter to load th= is firmware using PIO. + /// + /// This can only fail if some `u32` fields cannot be converted to `u1= 6`, or if the indices in + /// the headers are invalid. + fn try_as_pio_loadable(&self) -> Result> { + let new_pio_imem =3D |params: FalconDmaLoadTarget, secure| { + let start =3D usize::from_safe_cast(params.src_start); + let end =3D start + usize::from_safe_cast(params.len); + let data =3D self.as_slice().get(start..end).ok_or(EINVAL)?; + + let dst_start =3D u16::try_from(params.dst_start).map_err(|_| = EINVAL)?; + + Ok::<_, Error>(FalconPioImemLoadTarget { + data, + dst_start, + secure, + start_tag: dst_start >> 8, + }) + }; + + let imem_sec =3D new_pio_imem(self.imem_sec_load_params(), true)?; + + let imem_ns =3D if let Some(params) =3D self.imem_ns_load_params()= { + Some(new_pio_imem(params, false)?) + } else { + None + }; + + let dmem =3D { + let params =3D self.dmem_load_params(); + let start =3D usize::from_safe_cast(params.src_start); + let end =3D start + usize::from_safe_cast(params.len); + let data =3D self.as_slice().get(start..end).ok_or(EINVAL)?; + + let dst_start =3D u16::try_from(params.dst_start).map_err(|_| = EINVAL)?; + + FalconPioDmemLoadTarget { data, dst_start } + }; + + Ok(FalconDmaFirmwarePioAdapter { + fw: self, + imem_sec, + imem_ns, + dmem, + }) + } +} + +/// Represents a portion of the firmware to be loaded into IMEM using PIO. +#[derive(Clone)] +pub(crate) struct FalconPioImemLoadTarget<'a> { + pub(crate) data: &'a [u8], + pub(crate) dst_start: u16, + pub(crate) secure: bool, + pub(crate) start_tag: u16, +} + +/// Represents a portion of the firmware to be loaded into DMEM using PIO. +#[derive(Clone)] +pub(crate) struct FalconPioDmemLoadTarget<'a> { + pub(crate) data: &'a [u8], + pub(crate) dst_start: u16, +} + +/// Trait for providing PIO load parameters of falcon firmwares. +pub(crate) trait FalconPioLoadable { + /// Returns the load parameters for Secure `IMEM`, if any. + fn imem_sec_load_params(&self) -> Option>; + + /// Returns the load parameters for Non-Secure `IMEM`, if any. + fn imem_ns_load_params(&self) -> Option>; + + /// Returns the load parameters for `DMEM`. + fn dmem_load_params(&self) -> FalconPioDmemLoadTarget<'_>; +} + +/// Adapter type that makes any DMA-loadable firmware also loadable via PI= O. +/// +/// Created using [`FalconDmaLoadable::try_as_pio_loadable`]. +pub(crate) struct FalconDmaFirmwarePioAdapter<'a, T: FalconDmaLoadable + ?= Sized> { + /// Reference to the DMA firmware. + fw: &'a T, + /// Validated secure IMEM parameters. + imem_sec: FalconPioImemLoadTarget<'a>, + /// Validated non-secure IMEM parameters. + imem_ns: Option>, + /// Validated DMEM parameters. + dmem: FalconPioDmemLoadTarget<'a>, +} + +impl<'a, T> FalconPioLoadable for FalconDmaFirmwarePioAdapter<'a, T> +where + T: FalconDmaLoadable + ?Sized, +{ + fn imem_sec_load_params(&self) -> Option> { + Some(self.imem_sec.clone()) + } + + fn imem_ns_load_params(&self) -> Option> { + self.imem_ns.clone() + } + + fn dmem_load_params(&self) -> FalconPioDmemLoadTarget<'_> { + self.dmem.clone() + } +} + +impl<'a, T> FalconFirmware for FalconDmaFirmwarePioAdapter<'a, T> +where + T: FalconDmaLoadable + FalconFirmware + ?Sized, +{ + type Target =3D ::Target; + + fn brom_params(&self) -> FalconBromParams { + self.fw.brom_params() + } + + fn boot_addr(&self) -> u32 { + self.fw.boot_addr() + } } =20 /// Trait for a falcon firmware. @@ -417,6 +538,98 @@ pub(crate) fn reset(&self, bar: &Bar0) -> Result { Ok(()) } =20 + /// Falcons supports up to four ports, but we only ever use one, so ju= st hard-code it. + const PIO_PORT: usize =3D 0; + + /// Write a slice to Falcon IMEM memory using programmed I/O (PIO). + /// + /// Returns `EINVAL` if `img.len()` is not a multiple of 4. + fn pio_wr_imem_slice(&self, bar: &Bar0, load_offsets: FalconPioImemLoa= dTarget<'_>) -> Result { + // Rejecting misaligned images here allows us to avoid checking + // inside the loops. + if load_offsets.data.len() % 4 !=3D 0 { + return Err(EINVAL); + } + + regs::NV_PFALCON_FALCON_IMEMC::default() + .set_secure(load_offsets.secure) + .set_aincw(true) + .set_offs(load_offsets.dst_start) + .write(bar, &E::ID, Self::PIO_PORT); + + for (n, block) in load_offsets.data.chunks(MEM_BLOCK_ALIGNMENT).en= umerate() { + let n =3D u16::try_from(n)?; + let tag: u16 =3D load_offsets.start_tag.checked_add(n).ok_or(E= RANGE)?; + regs::NV_PFALCON_FALCON_IMEMT::default().set_tag(tag).write( + bar, + &E::ID, + Self::PIO_PORT, + ); + for word in block.chunks_exact(4) { + let w =3D [word[0], word[1], word[2], word[3]]; + regs::NV_PFALCON_FALCON_IMEMD::default() + .set_data(u32::from_le_bytes(w)) + .write(bar, &E::ID, Self::PIO_PORT); + } + } + + Ok(()) + } + + /// Write a slice to Falcon DMEM memory using programmed I/O (PIO). + /// + /// Returns `EINVAL` if `img.len()` is not a multiple of 4. + fn pio_wr_dmem_slice(&self, bar: &Bar0, load_offsets: FalconPioDmemLoa= dTarget<'_>) -> Result { + // Rejecting misaligned images here allows us to avoid checking + // inside the loops. + if load_offsets.data.len() % 4 !=3D 0 { + return Err(EINVAL); + } + + regs::NV_PFALCON_FALCON_DMEMC::default() + .set_aincw(true) + .set_offs(load_offsets.dst_start) + .write(bar, &E::ID, Self::PIO_PORT); + + for word in load_offsets.data.chunks_exact(4) { + let w =3D [word[0], word[1], word[2], word[3]]; + regs::NV_PFALCON_FALCON_DMEMD::default() + .set_data(u32::from_le_bytes(w)) + .write(bar, &E::ID, Self::PIO_PORT); + } + + Ok(()) + } + + /// Perform a PIO copy into `IMEM` and `DMEM` of `fw`, and prepare the= falcon to run it. + pub(crate) fn pio_load + FalconPioLoad= able>( + &self, + bar: &Bar0, + fw: &F, + ) -> Result { + regs::NV_PFALCON_FBIF_CTL::read(bar, &E::ID) + .set_allow_phys_no_ctx(true) + .write(bar, &E::ID); + + regs::NV_PFALCON_FALCON_DMACTL::default().write(bar, &E::ID); + + if let Some(imem_ns) =3D fw.imem_ns_load_params() { + self.pio_wr_imem_slice(bar, imem_ns)?; + } + if let Some(imem_sec) =3D fw.imem_sec_load_params() { + self.pio_wr_imem_slice(bar, imem_sec)?; + } + self.pio_wr_dmem_slice(bar, fw.dmem_load_params())?; + + self.hal.program_brom(self, bar, &fw.brom_params())?; + + regs::NV_PFALCON_FALCON_BOOTVEC::default() + .set_value(fw.boot_addr()) + .write(bar, &E::ID); + + Ok(()) + } + /// Perform a DMA write according to `load_offsets` from `dma_handle` = into the falcon's /// `target_mem`. /// @@ -659,7 +872,8 @@ pub(crate) fn is_riscv_active(&self, bar: &Bar0) -> boo= l { self.hal.is_riscv_active(bar) } =20 - // Load a firmware image into Falcon memory + /// Load a firmware image into Falcon memory, using the preferred meth= od for the current + /// chipset. pub(crate) fn load + FalconDmaLoadable= >( &self, dev: &Device, @@ -668,7 +882,7 @@ pub(crate) fn load + Fa= lconDmaLoadable>( ) -> Result { match self.hal.load_method() { LoadMethod::Dma =3D> self.dma_load(dev, bar, fw), - LoadMethod::Pio =3D> Err(ENOTSUPP), + LoadMethod::Pio =3D> self.pio_load(bar, &fw.try_as_pio_loadabl= e()?), } } =20 diff --git a/drivers/gpu/nova-core/falcon/hal.rs b/drivers/gpu/nova-core/fa= lcon/hal.rs index 89babd5f9325..a7e5ea8d0272 100644 --- a/drivers/gpu/nova-core/falcon/hal.rs +++ b/drivers/gpu/nova-core/falcon/hal.rs @@ -58,7 +58,11 @@ fn signature_reg_fuse_version( /// Reset the falcon engine. fn reset_eng(&self, bar: &Bar0) -> Result; =20 - /// returns the method needed to load data into Falcon memory + /// Returns the method used to load data into the falcon's memory. + /// + /// The only chipsets supporting PIO are those < GA102, and PIO is the= preferred method for + /// these. For anything above, the PIO registers appear to be masked t= o the CPU, so DMA is the + /// only usable method. fn load_method(&self) -> LoadMethod; } =20 diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index ea0d32f5396c..53f412f0ca32 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -364,6 +364,36 @@ pub(crate) fn with_falcon_mem(self, mem: FalconMem) ->= Self { 1:1 startcpu as bool; }); =20 +// IMEM access control register. Up to 4 ports are available for IMEM acce= ss. +register!(NV_PFALCON_FALCON_IMEMC @ PFalconBase[0x00000180[4; 16]] { + 15:0 offs as u16, "IMEM block and word offset"; + 24:24 aincw as bool, "Auto-increment on write"; + 28:28 secure as bool, "Access secure IMEM"; +}); + +// IMEM data register. Reading/writing this register accesses IMEM at the = address +// specified by the corresponding IMEMC register. +register!(NV_PFALCON_FALCON_IMEMD @ PFalconBase[0x00000184[4; 16]] { + 31:0 data as u32; +}); + +// IMEM tag register. Used to set the tag for the current IMEM block. +register!(NV_PFALCON_FALCON_IMEMT @ PFalconBase[0x00000188[4; 16]] { + 15:0 tag as u16; +}); + +// DMEM access control register. Up to 8 ports are available for DMEM acce= ss. +register!(NV_PFALCON_FALCON_DMEMC @ PFalconBase[0x000001c0[8; 8]] { + 15:0 offs as u16, "DMEM block and word offset"; + 24:24 aincw as bool, "Auto-increment on write"; +}); + +// DMEM data register. Reading/writing this register accesses DMEM at the = address +// specified by the corresponding DMEMC register. +register!(NV_PFALCON_FALCON_DMEMD @ PFalconBase[0x000001c4[8; 8]] { + 31:0 data as u32; +}); + // Actually known as `NV_PSEC_FALCON_ENGINE` and `NV_PGSP_FALCON_ENGINE` d= epending on the falcon // instance. register!(NV_PFALCON_FALCON_ENGINE @ PFalconBase[0x000003c0] { --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from CH4PR04CU002.outbound.protection.outlook.com (mail-northcentralusazon11013034.outbound.protection.outlook.com [40.107.201.34]) (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 DA190327BFC; Fri, 6 Mar 2026 04:53:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.201.34 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772801; cv=fail; b=UvHvRUEPOcUZoo6KLYD60rV6r1cuY7gtGIcDGdPUo2DntuyIrksxVcyatO0IOoZGb5bs5YR/rk+rdbKM2QWSK0cLblbkkoGhsTd2q+fMzGGiwTzIsMzvV/mCZkLVx0RKroPrkrWu3RQcU0T0zgASyOSps43s2AB8MxNnMeLhufI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772801; c=relaxed/simple; bh=XVNJlA2dZ9w7EiaPT4O2hsleNqLjOKbWVZZNX02x0Uo=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=YI8c3FRlvKo3mrHCdkykfZpTdtBctNE4uWmTltU4VlcJcl/EkUV7ufABksI8p0LGiTpxSs313hM43OthT+Em2IlW10JborKH/Ip0Av0fAL8dEhEURt2bNgTG8BQ/HYR0Ok98wxrlq0l5jR6FuQ4y7p7YcTjnQ33aDto6tS/0RuI= 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=jRVGV62Y; arc=fail smtp.client-ip=40.107.201.34 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="jRVGV62Y" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=sif/h+dIWC45i2bqEa0XHu2s56+IMlStfXGgEETV73SsJlM5N/k3CpPe7hrSdzNiN54SZJt2zXqq3T2opvrXN2wsWONzyvdNTdlWVc7qDlYXSCHAqVVbr5dN/UIc05IxkXCsFDp35Qz7m6KmsZdzy2cEmr5ylUHz7ulwj8Ou5H5QOe496yBmg1AZ08zk0GCv5LLBMADhoerQl+UTFwiINXahlYxfAy/fzYKtsLrBwK9+Y/NRUKUXz+zlLNgAUjFPtS7Dn2OIAn2K9wZ9O3/UkBld9o75JvqG3MPk5WKwwa2awCSKtOxPSiQDdd1ZSeJd6BrqjxDRnVSpDhm3RVV0Kg== 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=n+UmXhahXe+4L1gUxhExlEbqWMc6dC/3NxXDLSiAhx8=; b=T1JPk0crNGs8pbqJFL3SG9bz4urCMfT22jtzl+murz61DDw5S4SZpAdxvixt4Rg19xmsTZkRkHyWD5F8+mCkOWedVDYnPs5zEHHIjP4AzaRJaT5TKRg5yoSY8IKtcZpVqziC2gvBeQa6eoLxNwUgeF18V9EilqQmsOBDNLhK6/lGX9tQF9MpkJr0FW/DNc9xgu7MiDC6e8nYOMbjgaHzpwx0PnXzuyjjY/F1F9+HTkexDo3ziP6ZSX943baw9M9V5c82RPNGXzlPJUPtxH4dBZA4F/VZPr8UcqsipKX9uDNTdtOkvRAzUKkk1dUb5NLUgiYhn8ldLSXfrjsa3iFklg== 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=n+UmXhahXe+4L1gUxhExlEbqWMc6dC/3NxXDLSiAhx8=; b=jRVGV62Yw2HUzvCptEjcxboZcLmK682tpo53wQHkAEgXIvNnw0VQHQyYn+3OZ9bjhJM/ku0cskXDOqey6GVkPCm700gIYf5KlB/sC5FtArsbJqFRgFRI89HuohHz/hG11Tpc075jI1/gBc+W+ki1s57MsCqOjP9+eUculvBsHki1Uz0GkZkEHm2xX5259ZTU3yAu5e8UuSdlTC1nbD+ac4aAGI34Udq6+VmoMgE+KI+x8ETGDSoWLe5obfN3q4voLmjQprEhL8aL63gO2FX55gEQAF4VyxjfS0tB/A+4t+EPgiEqRffK3GOROTiygojj2uu1HGwwPybr1xGI38k/+Q== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by BL3PR12MB6569.namprd12.prod.outlook.com (2603:10b6:208:38c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.5; Fri, 6 Mar 2026 04:53:14 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:53:14 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:44 +0900 Subject: [PATCH v11 07/12] gpu: nova-core: falcon: remove unwarranted safety check in dma_load Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-7-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4PR01CA0043.jpnprd01.prod.outlook.com (2603:1096:405:2bd::16) To MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) 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: CH2PR12MB3990:EE_|BL3PR12MB6569:EE_ X-MS-Office365-Filtering-Correlation-Id: ff827ec4-861c-495f-71f3-08de7b3c468b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|10070799003|376014; X-Microsoft-Antispam-Message-Info: oh7d3bX0pLXNTHGNXtx7N1sH84dL543IPtozqxKxkAxvQGcqqYHRjsjd9pSyPvi9QeDobKPaX1DeDJGfR9W+U5nolNDEga44SuoZdZydJsJjc8LpOZKDwlrH6yuABIwI/0JJOMJietWt7UVXLWoEdIov5YkMrkQqMQv3uVrViV5kX0Ex2i0FNpKAgjQgXKVJ+MeFG+kEh7UBYI6JrDb2n7zAEK5jRe/BlEx9zcXx9UFFMWc1jsCDxvH2tPBpEfNElMnEevsMHTeQYTDgNIgLjqzM2679eYM8jwUPNwQspqrIrxOHyV4seEdPMOzvkUa03a7/nuCyq4rTu9je6WdGvD40lgjd1ILPXy+dl/7ImIWtxTiCxSs91Lq1r1CHpcD9CZNSlAYJTQ6fnOth/3Zo212YmZtc0pFdFDeAv7rH3hzpfynBRKEGr79Rg+2q4iLRLXvROsySMTdTr0KIg5ev73zSGkm0CYbpCI0n4T8BMg0OowkmAXGoE5lFDaQ0NOFkZmactB1Lsq535LAopeO1xa6XPrBUgqEZbtCgvOPP3/gSWXAXTS8yilQ1upRKYWHEqnkSZ6rFSH9T74niNP0BzIgj7/hPXmNpE6DNRu3EGQRKEltswxH4AJ1dmNmhtDOhhkGuzCWz6Byn3KZAsF6Yq6K20T/KkxshVRxSp4uMlmx3Ag/+LWvycutCX0p99KM5GXqDRiFMhdl2O8DqqsCPXLO80B2SvHZK8wsf36T+/GI= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(10070799003)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?QTZPakNGSmpvVXpmbFI5ZzFkV1M1NHE0dHhZL25nNnNtVEpjUzRTTlZSN1E4?= =?utf-8?B?OGY0K0x3bU5aQjF5SzJqY3hTNHZzUHdPLzhoejJtYisyMGxjZGVlWHVuTFVV?= =?utf-8?B?MGM4dVNMc0dUczNJQXF3Y0pkNU9QTVBxQStGWmV6d3pQZzdRRGRkMzBBYkR5?= =?utf-8?B?WUJyZGhaYzBPVm9OckpuQzNrZHA3dkR2SG9hR1d4c1gwQnFrY292c3ZXUXZV?= =?utf-8?B?SkhEVmcxcmFDU0s4MHZJNjlQU0tLdkVGaFBRWURIMlA3Z1NLdGVEVmF5VDBG?= =?utf-8?B?bUFsYUJtMmJ1Zk5uMVJOUFE5V2hWSStoL3ZpTGw5SG9JbEFndkFlb3FnSXZC?= =?utf-8?B?SmVhTzZGejV5MUNGaWxXd01XNXFrTVBZeVplRmg3RXRhQXV3eit1OWJUTnBz?= =?utf-8?B?eTRjcmI0NzFGQTVCUzhwTmZLTE91ZkhWa1Z2RUFRQWhaLzF4N0tleHF4dGtu?= =?utf-8?B?K1FwYi8yVmNuNThybEx2T003cnRvU0RDa3grS29sSEh3K09jbjJTMm9lQ25Q?= =?utf-8?B?S2tOWmtaRFczQjVzUlRwU01uMFVwUE1Sc0ppZUsydFd4L1M1VEFJY3JxdDAv?= =?utf-8?B?ejIxcW5MOWtkc3MvSkl4SFlHcnJXdFoybWNCelVwMmZQYStxZnNKVUJPNVc3?= =?utf-8?B?UXR5ZFJhNTI2NXlWUnBlMVZtQ2p1aEVtYldCZURPV2dSSzljN0FoU09FTzlN?= =?utf-8?B?Qm9ZcXZEcXY3OXpDTWE4MkpVVWxvT2YrQ0ZnT3ptZ2xXaE1nMU00WVQvSjU5?= =?utf-8?B?R2NGZC85bERDVUYyeFY0Qy9QRkQ4c0N2N1l3ZWxkY05mQ3p1Ynp4TjVmbzND?= =?utf-8?B?ZU81MVpSZUdiWFZKbHlqRVVMV1ZRQjZybS9lUXNwTnkwemF0Y0lJZGdQRW9i?= =?utf-8?B?YW13WkRpTEIvN3FOb01iTlZESlgyWEZ0aFc5cXpKVUxzSWVLSWlMU3FDemEw?= =?utf-8?B?bDdkSVg3K0RKMm5WSjBuVTY2eVRzOE03K25HemRhY29mZFFyRmd5UjJaNUR1?= =?utf-8?B?bk53dlplOHhKTXJQKzBWaVl4OEZKaGNldk04aUFaZWNNSUZObGFnS21qenFn?= =?utf-8?B?NStvMzcwNCtnMjROU2cyaTJJZ2lqVjlWZE5xeUMrL1h2dlV1ZnA0bFBOSWph?= =?utf-8?B?RGpLV3RPUXRRUXV0QUV5NTR3TkU5eG5kdzY1bi9vRG11d0RYU2tBa0pYT3NH?= =?utf-8?B?SU9hSW4xR2wrS1BQcThjc3lZVjhNM1oxWHpWZFpMaUpJNy9DRnlkb0gwZGMx?= =?utf-8?B?SElsTEdIVzJhL0xnZjlOa0l0aVBEd3A5elZwRTFyWTlDZWY2N0tSRkFKVGc5?= =?utf-8?B?dEFkZHVDSjJySUdxTFpQdkk2Tmg2V0dsSWJtREJuUmtpMlhIeVRmOUlVOG5k?= =?utf-8?B?b0hSazROc0VjUnZxNVFrQ0UzNWY4Z0RsSEUwT082QWRsWDlUakRaaW50V00z?= =?utf-8?B?OUcwSjgyTFdIMGRoSm5iOGYrNWZXQWRiWlBSRzBLMXd6Q0g0TWQwWGVOTWNN?= =?utf-8?B?UHNHZFVWM0U1VWRoYnJMV3BJQ0pUYjZoTWg0WVNkSER6Zk9KeUFXNWRzQjFK?= =?utf-8?B?NlBZNElwSE96Qi9IQ2s4cndPSXJJQXp3S3czZDhBdWUxNUwvR0o3emlhTGQy?= =?utf-8?B?SnFtVnQ1K1dlR09scXg0NTRLbTNpWWJ4U3NTck9TdEhPc3pJZ01Ka2IwUGhY?= =?utf-8?B?TGRiMWJJNXhINEVEd2pEd3BRRXhpbUpMamdFeDE1MjhTMEovWWROc0FIbTJj?= =?utf-8?B?V0h3TXp6VVFDWE11K3g0YUFlY2hXNUNqOUlZM2Y2em1BR3dIcEdXUWgwVzZD?= =?utf-8?B?ZGNvUFRCNGhqaUhCRU9aRUFQNHhIaXFpMzM2ZWY0ZE8rVCtBV0RFbVIwUG9p?= =?utf-8?B?V05keGpIVXVHN1h1b0xDYXhyWTRKbk5CUjlOaWZ4S1lybi80TExsMTRVUjFY?= =?utf-8?B?SWhiRDdNeXAxQzhDYjJVRXNsbFNxU2lPc3RiUzVsT0VRL29vTHdUUjJCNE4z?= =?utf-8?B?ME90T2tISitqUWpGb3AwUU9tUUVkMythSElhWUF2ZTNLejFwNGo3eTVEcFFi?= =?utf-8?B?cGdBR0tyaHFJa2ZEd0ExZHdLblN1NjVrR1RYa3hYdCtvNEV6MGltb0ZhUjZB?= =?utf-8?B?cXRYN0R3UFJZelRlbXBETEIxbzRXTjhTUkNsV3JlV2NoOWZZYm5BemdIanRh?= =?utf-8?B?SWRXR1FxZVhPTnJOVUZNMXBPZmJMaGNHME1sUEZxUVhoVXpUUmI1Qzh4a1dI?= =?utf-8?B?WUUxeTQ3NjBMZ0NiWXVoRWRMa2xRZVRnMmZ4NGV6N0phM2RINDAzNDUxZllN?= =?utf-8?B?ajJiQlh0V1JaTTBlMldDK2ZkUnBoN2FEMzcwVXo1UEQxNDFlanZ2TWZUTHZG?= =?utf-8?Q?VxCqIqOd6TxPE6CuIrVKY6cYzuN6jT601KsnQ1RalLaHc?= X-MS-Exchange-AntiSpam-MessageData-1: zCXKUIXG7DIXtQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: ff827ec4-861c-495f-71f3-08de7b3c468b X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3997.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:53:14.7948 (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: 3aSEuZvydE7kAY3aKknJREXq0hSTGuUAQJm5X44D6cySNnkbyJH92E2Rr76WMqIH9eXlKsQ7iTJdwGHjs2f5ww== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR12MB6569 This safety check was an assumption based on the firmwares we work with - it is not based on an actual hardware limitation. Thus, remove it. Reviewed-by: Eliot Courtney Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/falcon.rs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/drivers/gpu/nova-core/falcon.rs b/drivers/gpu/nova-core/falcon= .rs index 2168ef2c5148..7097a206ec3c 100644 --- a/drivers/gpu/nova-core/falcon.rs +++ b/drivers/gpu/nova-core/falcon.rs @@ -740,13 +740,6 @@ fn dma_load + FalconDm= aLoadable>( bar: &Bar0, fw: &F, ) -> Result { - // The Non-Secure section only exists on firmware used by Turing a= nd GA100, and - // those platforms do not use DMA. - if fw.imem_ns_load_params().is_some() { - debug_assert!(false); - return Err(EINVAL); - } - // Create DMA object with firmware content as the source of the DM= A engine. let dma_obj =3D DmaObject::from_data(dev, fw.as_slice())?; =20 --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010044.outbound.protection.outlook.com [52.101.85.44]) (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 1DBD53321D8; Fri, 6 Mar 2026 04:53:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.44 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772803; cv=fail; b=aPzHL9Nj/OdARw3uuYeJPES67Dj60mnFCBuM4jF1O7u+zN0RzBaLQjoMa61VCIqlxst6Resx7TcOUQUf7fi28h2CDh6vnF0ye8Lbxbt6FQZ2wr+aXiKb0iXsHhRKwl+FQYP89H8+4Mwdesr1j0sJVfTPKagsoXcpLsKys4KeOkw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772803; c=relaxed/simple; bh=q3tD/1EcrXE7TLopGH01Yz/LiKbv5n/XdyD87rLAgZw=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=I70FUPrIJCmSIHH44P0I2LxpTBI4ITiZ4gpecEUSgpun90peUzG+AMuZKpvgD0KDZaOa+ebFxArGAf0YFcnpqWVBvcCgOmkGMrx8lic0i4D5dHWJ0RXQ26V/EBcqlMq1AlkBC7Rjlp6IqWiWJHXdJgtSIxb4sYo9yDzfDBUoNqA= 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=ZCLi57mt; arc=fail smtp.client-ip=52.101.85.44 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="ZCLi57mt" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=i8i25r40H3ABSH1Ax21CKmsAkgG5Oz5k7D86OHfQQhIjA0DGunb9fRJ2LqBtEJyb4OlA45oBD6sWR3HNuhCXKTFvWArt3WM+9Ks71qinXZHKr+8581nadvOMsHKiZWCEyWWvXPKU+GW4RWdnASXK+sDFLIqPjl9JYzxd8F7qOENKr39mKXyEG2YT0szFsOcLwMiOSy4JlunirD//4fOnBD9VdOvx4cfpzJLR3Xxf0XiSbyqrtp+EfRKDOtuhtpsqbF47xFmgaBeHFhmr1xGzdbiQmRMTGJPuGYzg0NdF6bKkfjj1avQfFMw1ewg+5gEWtH9jPN68/nGzWd0qABelNQ== 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=rCk6KrRuBf8BAW6Z970XGx4N7F8iQRq9uoTO/PZ3RTE=; b=b/bP36F3JDirkYPfiI0/fHdwF1dRrDWA4oJ/E+iWn8wTFbn+HA8JRnmCDFbpeb/vCGhEC73xEtA9HQObv2TreLk5hDySsx0TXiCS5AMEL/CX2Qk3zb1r5TR/7fpxYD+tq+DwBwFkFAFmCh+gTUt7xoKCsN/6hhpb/kJFWmc2vemgJw1MBn6MuyTismNeHuVA7gdio0m5/4vjuRCB6phome/pSvrxdoplypK0zaDh+3E3ifjiY+UIOTMTLsv6NlEbP8XSBRmvbifJYrFsHRmiiKdP8x02OetpMuyGaPlkfuESfMORu59Jhn7UbymTw6bjpNrISQgb42MGRn2IGNY8HQ== 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=rCk6KrRuBf8BAW6Z970XGx4N7F8iQRq9uoTO/PZ3RTE=; b=ZCLi57mtG9nV43bxW4W1q5+mHzaa/MRPHHshrD/V1dIsiz1kYiJyeoj/rgjqN23LjwbD2mBM5/rbt7saR1mzxCZrEesr1qZr+CcXTlhKkXxdsKx39VcP2hMu1rQJC1oLlWdZpJxL/Et1pZ0naSzFDTo/nxRNvHyEUtvFHKrzD+8x8qhkM56Eb18X5uIBnVggQ2PnV5nax2TTtDFKZIhHXas580m63weSDeYJLOBG7v8tpwSUzC4UND41nuW5vU4b9uBbANvJpmkAOvrO4M2j9d8XKxU0YyOT3cEFCWlMtIGPylY86ooYi8HYod8WFEMqVpiRWDbLjr/UYX8eHTSRAg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by BL3PR12MB6569.namprd12.prod.outlook.com (2603:10b6:208:38c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9700.5; Fri, 6 Mar 2026 04:53:18 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:53:18 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:45 +0900 Subject: [PATCH v11 08/12] gpu: nova-core: firmware: add comments to justify v3 header values Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-8-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYCPR01CA0046.jpnprd01.prod.outlook.com (2603:1096:405:1::34) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|BL3PR12MB6569:EE_ X-MS-Office365-Filtering-Correlation-Id: 1570d9da-ac9a-488b-f14c-08de7b3c48e9 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|10070799003|376014; X-Microsoft-Antispam-Message-Info: J/+AoWbgPwZtFTQDDPyFN5YV4/6q56cXR8uYEwYqYIvG9FeKm8qmsENeCNbqRrjLNUxDDCfG7msNrDItnrJmbzWWYiyJqyOsHAxPpklDPgYYsw+kjOY4qQ3eD/ZRD+4uwek0Kqd9aUJprakjAzHIOJlVlIILkLwyvWnbuCMhNNuhYdPIxXuf1ODHLfIKRuWGoxkvxU72ZFT0F0Snko74bwQ20mXfU+L93ccF2WTSiu/u6f/4u+zyyGseJg7w2ocKEvvebiYddjYc43qO52qztYSIhpyNk6IF3Jen+bfRqz/L/prjSAj/XYwJmMIm3oKBDhtxSQ9PbJFQPZRwnV7VsJYpTHyrW1n0p6OifMNOJlJBywTZxlAceTV8Ao5oQSPNBa9ays/gj312YB6aml4m9WzaOuifCHFU/IshG5yADqQixf9mS5Wg0iBpyj2Uhez8REfs7kbWw4RUTc0MBWuC0D9pp7VUERPTaCA1VeEnUmXJyFmPtIKDflrbEvObngDVto3lrEUkTVQ/wN1eVsmm0jzb6AH3JInROTLs7II8oT8paTvuvOYidGXfMo3t5K1Mo9JQYjN4uc+qFChgo12CE7cUqUyQMoIO30Pl7tEzN1YEQ0q4UuJyRv4EOB/8SjI8yW6lrhIapQXhQOBlvy8Qsrmt1EJNVK0UA3TN1RmYHUE5fthA9Z4AOv4MZenVoRJpp4eN2+HoP4kp9chjZeEDz/Ee4JtFOVN9+JwI8sLJgZw= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(10070799003)(376014);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RjU5WGhtSHhyQWY2YjZsc2xPTUllY0J6bjkvTkh6cjBkSXBJV0VKanlWcFFQ?= =?utf-8?B?d1oxeFFZeE1wRkl1d1FuSGJ0L21oeUxCU3prL1Jic2hscDVFcXY4ZDNqa1dz?= =?utf-8?B?LzdXNkw3VnpId29ydnVXalppUjBESzRYYmxTRDBGWWxzL0R6eStObGhOM3FH?= =?utf-8?B?cEdNZ1k2b0tyWWVreU5CWDF0bURHTEZUVDR5ZzhvNk1RZVR4YzlyaGFRWnAy?= =?utf-8?B?Rzlsemljdk5QdFYxcUpwdnI1TE0ySzBvUHRuNDV5b1loRWozRkpWOFZOZTU5?= =?utf-8?B?MGxPMkVMR1VBYW0rcU1rQ0UxclJLOU8yOFlJWU9DYUtTQ0pRekNUdnZTTURV?= =?utf-8?B?R1FIaEdoem9SKzBLR2h5M3kvYjh3clBhcFdYemhjVFk4cDNxVFdsMnR2MXBI?= =?utf-8?B?eFc5T2xNeVRKVFVma2pZOWdjYmVvOW1DMFM2UGVBK2ptOEV0UlV3NTdQYTQ2?= =?utf-8?B?V09ua3lXeUQzamczVWZhRUZWRU8zdEhvdzRzWDRJYU1MRDZERlROSzhDU3ha?= =?utf-8?B?U0YvZnlLY245T0xvb0dNR215SGZQUlpubzV0ZkFaQXhzMysrUmlJTFdvRDdu?= =?utf-8?B?ZTZZWmt2N1dHWDhLcmIyYWVBa1M5THBlUjJnRU0vbDVHTjdHb29mOGhwODBh?= =?utf-8?B?cVUwRlFHVkZGdTlVZmh5MU1abXN1SzNESG02dVZ4Zi9XZzlaby9GNERnZmVR?= =?utf-8?B?Q3BvYlhpY0xMTG0ybEFYWUE0N2t3YkovakNnNGdYMTlnR1U3UEpETFQ4aFhK?= =?utf-8?B?ZGhMRS9aUmxmU0J6Z2haWlBSNWw0dy9FQnprNEplR2lKQ0lsb0RaZW5ZbGpT?= =?utf-8?B?RHZNOUR2Y3Q5MGFHSnoydERTcUNXbFZoZW5ralFCdkxZVGVjTS9qdU1MdkFV?= =?utf-8?B?dlY3UjltZUVwWHJQS2hGSlRyOTBlQ0ZFTzVhVFlRaEF4SzJRbERGcytTSU5C?= =?utf-8?B?K2l0TldPUllZUjZGM2xqVUhXTjNwY0hjZWpOSWpFczNXQktJWTM5M0xUVGNH?= =?utf-8?B?TytGN0wwSThXRWdselZzbG81bTdGUEVMaE0yZTRvSUt2Tm9WNlFQZG9TbG9B?= =?utf-8?B?ZnduNjRvSjh0SCtaTFZjVVpGOHA1WEZkcG9JTUZ3K0d4aXZWV3cwaVgrbWhG?= =?utf-8?B?b2dZUEcxbGZPZ2JMVXQxVlhnTEx6Y2oyQUhJM21QRjk5R2cvTEJuWUZLcThB?= =?utf-8?B?TldycjJ0VHR3UFVBUmtmNHZibmVmYXBCZU5qdDR2ZWpGL0xiMmJOMTI3aHdL?= =?utf-8?B?TnNoQy9kMTdITUhzZVBzdGJQWms2SndHOFB3R1owWFZvV2VUM2E5SFVjN1VI?= =?utf-8?B?NWF4Y3F4ZUphV1Y2cmRZZmlhK0RuczNHY2kxWEVqK1owOGorLzhiM3B0d1JP?= =?utf-8?B?ekQ3M21WYUhDaE51SUhGaTdtREVKYlRUai9pK092VndDN3JiWGFqeVlTN3pj?= =?utf-8?B?Yjd2RnhoTUNWdERGbEtTMmJaYWx2dGJRYXVBaUllSXRZU0tucis4MGtSQkkr?= =?utf-8?B?U3JSdUs0UGxqUWNHK0xzdTkreGhhL2haby94Ym41cjlVNGFIRFNYNndNZmYy?= =?utf-8?B?Rm45M21TZm95bWRRcnpSSkhvNE5GcXlTaGZsSkFkOGFuME1DZWJ6RHYxYzBV?= =?utf-8?B?VmpiUkNQK05YWk9PZlg4elhpTGZkQ2VkdmErZE1zTThmZ3VDYnJYNktFZTRy?= =?utf-8?B?em5mVW1FaDhMaXpzeVpaUXlhRHR5dkJBd0svbzFJS1NZZ1I1NFUvNmlNcVZ0?= =?utf-8?B?M1paaDRjVHhOcUJyQTdoNUVLNlNzV1ZoVHMzUWpVMkpNZ0xVV0NZRFluOVBU?= =?utf-8?B?cGZReWxIWUpoZ3hqS091ZlVrT3JyeWdESTdrczNBc0N2MmZyVDcwWjJzWnUx?= =?utf-8?B?RkVZeGg2WllnWG9IZkoycENuaHJ2cVFNVHVaRjhvZXVhT2dZbnVnOGtlN0NY?= =?utf-8?B?d2RYcFFkYnlqWDRQbGxBaXd1K2JzNXZoSWZzSG5RRXZCZTBRWUpQUTZuUW9C?= =?utf-8?B?NnVXZnhQOEpBSnFJV2I5dEpxUlR3NC9SSktQc1Ayc25BYi9FRTBmV3pFanMy?= =?utf-8?B?c0J0MkYycDhzQVhoU2RWclMwTW5oekJOYUVqWUtZMEZVVit0WFNkeXVWc1BF?= =?utf-8?B?NkE0YVRicy9nZFkrUVIzRmpyV1ExRmJXWnlPbk9RQkVEOFc2UzNhT21JNDgr?= =?utf-8?B?UTVJNkdMeERvRVdYcDh1MU1KOWF2VGhLa3hCYXZ0Wm1YTnFsR2dKaGV4V0Mw?= =?utf-8?B?VXp1L3NvVjUzbTMwY0ZUbThOZEI4V0xWdUd5RENSVHdvVGNJSFlkcGY2VlFC?= =?utf-8?B?V3JxY2FsM2pYam1WL2RCZm9hVXRodnNadkRndnNPTllHek9IWkRuT0dLZVFP?= =?utf-8?Q?rlBm4Qh4s2P+YI0lf0b/RY7BLcIJcr3yPccqKdgVLKBRc?= X-MS-Exchange-AntiSpam-MessageData-1: J3FbtQ9mywZgjA== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1570d9da-ac9a-488b-f14c-08de7b3c48e9 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:53:18.6057 (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: B6VNl/LmJPmWelHhk+lxZZtJ2VJUla302e2PTEarpx/Mhd4z6DsX8IunaZJqq7Q1Ck/AcE3NgtJieyCXMyOpKQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR12MB6569 There is no member in `FalconUCodeDescV3` to describe the start offsets of the IMEM and DMEM section in the firmware object. Add comments to justify how they are computed. Signed-off-by: Alexandre Courbot Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/firmware.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index 677e1dac6d9f..c2b24906fb7e 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -260,6 +260,7 @@ fn signature_versions(&self) -> u16 { =20 fn imem_sec_load_params(&self) -> FalconDmaLoadTarget { FalconDmaLoadTarget { + // IMEM segment always starts at offset 0. src_start: 0, dst_start: self.imem_phys_base, len: self.imem_load_size, @@ -273,6 +274,7 @@ fn imem_ns_load_params(&self) -> Option { =20 fn dmem_load_params(&self) -> FalconDmaLoadTarget { FalconDmaLoadTarget { + // DMEM segment starts right after the IMEM one. src_start: self.imem_load_size, dst_start: self.dmem_phys_base, len: self.dmem_load_size, --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from DM1PR04CU001.outbound.protection.outlook.com (mail-centralusazon11010006.outbound.protection.outlook.com [52.101.61.6]) (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 9320529B781; Fri, 6 Mar 2026 04:53:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.61.6 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772809; cv=fail; b=c9SASQ8q3EUhomOtyJKV0ktj3B3Ki7jK82wd4YFgwr1Qj3gt4xNx3aHpkSTk+5WZwi8Ogw/RGvB9bDsEdjjl0rkxMQi3CgYDkvrHnMCZHFy5By0QwufCsxUopB/5ihmvSYv0Mu24lqzCR3an/sGTFd8gKEKN6Rbc1YfwYVB/j0o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772809; c=relaxed/simple; bh=HskFYL5wrs71EtgRBhspKuOuPIl4D5J7H8kcB1iFFJs=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=bQYAUndk8oG7W4mOHTEzpgoc//tL48cowv2wmCuN0j0FU/bLLqAOavTnPuzhepNAS1rEzz8+d5IjdZfnzBAg9mjg9eDxkfL/5tAeCEMOVZ+S+8PyF+LVZAQami3K8cQy97ZUyZD03tfem06AP1jcK9GteSzBunFJc0gtB5B/U4A= 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=mGqUxlSz; arc=fail smtp.client-ip=52.101.61.6 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="mGqUxlSz" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=tuOmbKn/f/AVPCE1qT1Cz0kCfVO6c11n2voF0kezWjkK8eqmoEk8NnJ9v1GMh//9wOjeEfq3P23SMCaiRAmw9MyuC/Sw4mKxFjiTvNIjXUKOvO/LVj94M8HmID1oyKeyrMoxQ+DkegmWFeyCXRCpmPNInaeRtB/Nm3uLrZ2wrwNCWkAx/TYCBnRMMSddTaXXpxIYOEYrNbcP8ussVgVi8peUZaZO++/WRcyxLSP/y2apQ8ohVUDqW879Qpgz9siKc/3W0Ned5fAsSoYofjTimuQiVvYhePEbIkHc28F3zqYtZTuECq3azz7PId0QolhM32DkEwadEmnCmDfXkjMPQA== 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=PQSgrAt1rQredlzwinxJILhkl8qxl55sdHyA0ngNSyQ=; b=oe05f503r3LGwV/Y+tL9tJ8+SDVwJkCDailX35oAeSNnDWb1Al9fPbYmp4YTz7Pl+PTq9EihAgHO+9gHkffA9O07/AByCYipxIJTCZlja94TsR9D0ndj42XN7Wazo/t94CAh61h1dIGakAnOgB7IC8SsYsxZGtHn01MPx0ycj8bWpx80yEWpJ3yWkJb+NnVA579QLnLttDvsBro2nxbGpQL3D7NaleZ5IOb6G2H7IceQFAqfwcSzvKaMPsaUW45CZ9SBCefRN3a6EaXNM6yiib+a6XKQMY1VwFriLTPlkq1jTZhrrCanUC4qRESwIdMetzot9r/NH8Wgqu+nMLvUUA== 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=PQSgrAt1rQredlzwinxJILhkl8qxl55sdHyA0ngNSyQ=; b=mGqUxlSz5KDrCLYBF3qBZqeqXbSIEFIir+JYhaddI8jWPkyo0Slu5gyefoWrHGUz/ud1tbh4J4MPet5GwF9xzU+Xp30I5Xn08ZE0934Nu6rblLdP5rz9KsO3Y730PyWK8gofn15rgvbu0EdNuDXSiHDoleyH9DIyy200e+umZwzPsgGUbb7JlBUz3+HadSQSD9JqgGnTVIXv3ZzVtmGbY2f4xq7YQubfveFkz1nr4LOYqz4DdiPVoU3jfVPU/eWIbI6sqKJuW0ZD2w0q1vv8ofclxA4DxHvGqxK7uUsBK3DpL7e3lj0QthPlfSZThxcZAo/JS9Jccy2sHLoi3dyCbg== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by IA0PR12MB7554.namprd12.prod.outlook.com (2603:10b6:208:43e::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9678.18; Fri, 6 Mar 2026 04:53:22 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:53:22 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:46 +0900 Subject: [PATCH v11 09/12] gpu: nova-core: firmware: fix and explain v2 header offsets computations Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-9-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TYCPR01CA0190.jpnprd01.prod.outlook.com (2603:1096:400:2b0::7) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|IA0PR12MB7554:EE_ X-MS-Office365-Filtering-Correlation-Id: 13b39660-0be9-422e-5f6e-08de7b3c4b2e X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|10070799003|366016; X-Microsoft-Antispam-Message-Info: NoAgsgm95NlNW099THYkvSeWpJElvbt+C9UyNnA7GEtSFcAF+k4g6AOfDiffr7TgYRZ1GNi6iiiInl/PkQHnYMK+88pUpfmY65ef7+xjqtRD1UfSR9VizGi7XBU+HuAodp2wsjGUTY66riNZ5nW8vLTiU7RDOtb3PTKSUJJBCzlzm3ewYGdpKjfwnslEJYDyR62LHOkzCwq95D4cXi7f4IKKneTmYNYIaEdIGkV9mKw0Fiovr8TFr6m9m6uxg8ZmxxYrrjv9+IP5ORlbikQJ9j5I+KETxzL/mPXz1JQxNu8bgqLN9ujzWwebqSFZcCu2LbFZWNfVAD15ss/tcKyfpclyBE88dd4yZwoPmwYwtLSaFYCsWNgFayWUwYhlZls0kMJu7MYmUnlNrz+fCcIf/kF+EUXg8QNPx6VeUql034oo/Ci470fiVbwsE+qyTg2o0JmBuwJhM7Z1lqdmDZVcthkXO2GvA5eS033T6N8FPfmvATDct9GjbvmXUOTnlqHwuJUmQg2bA9ntY0OiIWC//qKOI7QESeTyovPdH8XECYXXJQQMwW8LrzpUQrqnWFrESG1cpHnBz8W3W+guSiKOd6h0/9pTGdVPTDdy7+OXi/Ion6FYkDlak1Z9bxkrNrSY8LrMIva9/fre+jJn7J7elZUy3xnQKBMdvkxFCsw+4pJT+XkY1qzbJNClrITDHZ7B42nGUJZAa9yqVlDtkz6HnNRmGDYlBNIJDjW734CYpcs= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(10070799003)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?RkhoT29pcmFYYmYzRW50ZG1rTzhCWWYzT2JJaHNGMEFlN2RCYmRGM0VDWW03?= =?utf-8?B?dlpZTmhmL1lXS0pUZldjS04yMDF4OFlvcW5Xai9XVlFMOFA1V215OGhad3Iw?= =?utf-8?B?OXRkekVKc1BUekE5bllBanpybERzaCs5Y1JaV1NDN0ZKcFlMRU92Z3MrU0NZ?= =?utf-8?B?Tzk5MzRJWWc0MjNwNWJlOGNPQ3RiajR0YnZSNnV6M01kVWtvbzk0YjZCL3dk?= =?utf-8?B?S0tzbGlrRlJucWRjRmpkdFBPd2tXR2FUeUZIa2kvaTVZWVpoNU8zeFprRG54?= =?utf-8?B?M0d4cjNvT3BPVnRzbjA4Qk91K0x1S2cyaDI3ZU9tajFGc0o4WjZSUTRLRDl1?= =?utf-8?B?cFZRWDdtNGZ4L3VBaE1WTXgwRGFEK25QTXVEM2tvcEJxL3FleExxTkZlbUpu?= =?utf-8?B?bmZlKy9nY3Zyb2NuS0F0N1ExUU90WUROYVJVZTlqODNmREh2Y3h4b2pLaThU?= =?utf-8?B?cWZpT2ZPbEFLS0x3MjUwclh1Ykx3K1kzb2UwZ1hYQWt4S0QrQUw4M2VINnRY?= =?utf-8?B?UytKM1J4VStwUndNanV0TEZET2NDZ3NCZ3pMNHBzNGRNdDRQQVVoYjRRK2pT?= =?utf-8?B?QThBeUdmSCtqOGF2TytnOGJSM0RGY3lNYUxlYjJJQXBhYmhMeTZJREhNMTRi?= =?utf-8?B?bENiUGdGMXlTNVVCdzZuV3V4V2hQb3U5SXl2T28xc1BWaE9QSjhrYjV3UTRr?= =?utf-8?B?TnNiSXFYaVBlb3U0cy9Gem1NOXI3blBGQ3lIWVh1UFJuNVh2TjhCWkNLc0Ju?= =?utf-8?B?aVkyVjdOZWlsdUtHOVhnUEpDNEkzYmg1N2N0QncvL3NiNVVxNHpmeTVZcGt1?= =?utf-8?B?bnVka2ViNCtRTGFTaWx6OGE5ci9VVURZaHRDU1dLWG5tM1R6QndPUlNPLzNF?= =?utf-8?B?aGdvKzMrR3VObmRrSFRGK0lyWUhKY25oRWdHNFpjdzlPOXowVWI4K3FvZlN1?= =?utf-8?B?VFhFQmVrdjlpRHFpL1RUaUhKUFA2bm5UMVhtbWN6RDFjelh6QXZKU295MWpY?= =?utf-8?B?TjhBeFpEY3VoS2xRWlQ0NnVFcTZnOWREL0p0UWNqSmo1emRCVUZPZzhUcnN0?= =?utf-8?B?M0NDbGs4bVN1VmpZNzArdkE1czlmMTgvSER3ZytRNEs4SVFKTm8wQ1JndW5U?= =?utf-8?B?Ni9Pai9Kb0FqWXFOZ0NyeEFWOWEzb3E1aTR5WjBEQ241SE9kbnpCcmcvT0tq?= =?utf-8?B?Z202bFdyWVZtTnByUU9nUGJPQnFMM3ljRnIxRCtMNGh6WEhqOEpHRWd4MkFJ?= =?utf-8?B?bkNrZVRGeXJJYkRLZDJHa2FDak1zQU9TY0hXWE8wWnVCbmNDTzI5a2ZvS2hM?= =?utf-8?B?U29mZXFSeFNpU284OVlRd3lwMCtwakhaWm9qVDZObXZqck9zaUdRc0RLVVVX?= =?utf-8?B?L1FLMkEyVkFEQjgvTWxVdHJVL1dBcko5MWZZeHYyb1VVVGdxWXNtUU1mc1JQ?= =?utf-8?B?ZXlPeDUxV1FpclhWS2VyVlVzZjF0L0tyaXlBOWpFdGhlWGVUVUpybDFSQ0ZD?= =?utf-8?B?SmV2M0lqaWh1WFNPeFUxTFJReXVCYmV4RHpXNUwrZ2JiR0dGYjZhU3VURFlu?= =?utf-8?B?dThUV2ZwRDZaU1FwVG1LcERvMWx5bktqYlcyZlRWRVZ5T3dUQm1lNU9EYWtQ?= =?utf-8?B?M25yRGRKWTk4Nkc1RGxVQURybG1pcEIzb3F2MXN4MWxtWW51OGxlZTNoWDNr?= =?utf-8?B?N3BsSHlkQUppN3NrUVdidWRTL3J0VEFqU3NONTNubGt5anhVNVdIMjE4aERC?= =?utf-8?B?YXJFYUdXRG55WjFQMzd3My9Ddkk1MmZNMjhvKzlmMlFaakVWZ0tYNlVyWWZt?= =?utf-8?B?SHgxR2g4Wm92b3dzMTBFVnZyMmVaVEladGQwcStsUGVwRzJHZXRrUjlEYTFq?= =?utf-8?B?QlVQZjFXaWprYkhtTUJpM2FCTkw1L3dJc2ViSmNpZFVyQUNpemFtQ1hpdmFL?= =?utf-8?B?bnhydktTYnJaYnlHS2pVMXFKck1nWjVyeXpIN1BYb1hadlNRWk9qeUxFTDVK?= =?utf-8?B?Sk5iZzZJRGpmRXBkbWlVazVpOVcyZkZMS1hJTE02dzFHSDZoenJNNmd0NUFN?= =?utf-8?B?Y3RCRjNuYnBMMW1EUmdYM1pJeThWb0M0Tllhd21IV1I0a081TW1kQ3NqV3JM?= =?utf-8?B?bk1KL0dWOXhlVm1ReFg2emlpbXNXNzRKMk8wdTQwWnlxS3U0dzh5dlVLL1Nq?= =?utf-8?B?VkJVa0tjelg5MmMzOFY4NnlRZXFxUjNmeW5zNFUxbjUvWGdsL3c3ZFp0MVJk?= =?utf-8?B?ZVFLeWVyLzRKb1JucTRHa0szR3FDenoydFpCdGQ2c1dWZTBlR0dkUEpPRUVE?= =?utf-8?B?SHY3bW12UVBoKy9tMTdHTG10VXpRblIxL1hjQ1RlemtSdjdISVhCcFM1alpK?= =?utf-8?Q?JRnczSRvkvtFyE1Jbd+j8ApuRNeBOSdyXWcGVYoFXFewI?= X-MS-Exchange-AntiSpam-MessageData-1: 85hZ//6l23MFWQ== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 13b39660-0be9-422e-5f6e-08de7b3c4b2e X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:53:22.5382 (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: hrIbYBVmpCBX59OGMl/JVfQCTgEp9iVTD14Q9FmKEJ2KmwdLEt2YDbyQTFK/HSD9x3hjC+fS916zqvjK4n2bDg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB7554 There are no offsets in `FalconUCodeDescV2` to give the non-secure and secure IMEM sections start offsets relative to the beginning of the firmware object. The start offsets for both sections were set to `0`, but that is obviously incorrect since two different sections cannot start at the same offset. Since these offsets were not used by the bootloader, this doesn't prevent proper function but is incorrect nonetheless. Fix this by computing the start of the secure IMEM section relatively to the start of the firmware object and setting it properly. Also add and improve comments to explain how the values are obtained. Signed-off-by: Alexandre Courbot Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/firmware.rs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index c2b24906fb7e..5e56c09cc2df 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -63,7 +63,8 @@ pub(crate) struct FalconUCodeDescV2 { pub(crate) interface_offset: u32, /// Base address at which to load the code segment into 'IMEM'. pub(crate) imem_phys_base: u32, - /// Size in bytes of the code to copy into 'IMEM'. + /// Size in bytes of the code to copy into 'IMEM' (includes both secur= e and non-secure + /// segments). pub(crate) imem_load_size: u32, /// Virtual 'IMEM' address (i.e. 'tag') at which the code should start. pub(crate) imem_virt_base: u32, @@ -205,18 +206,25 @@ fn signature_versions(&self) -> u16 { } =20 fn imem_sec_load_params(&self) -> FalconDmaLoadTarget { + // `imem_sec_base` is the *virtual* start address of the secure IM= EM segment, so subtract + // `imem_virt_base` to get its physical offset. + let imem_sec_start =3D self.imem_sec_base.saturating_sub(self.imem= _virt_base); + FalconDmaLoadTarget { - src_start: 0, - dst_start: self.imem_sec_base, + src_start: imem_sec_start, + dst_start: self.imem_phys_base.saturating_add(imem_sec_start), len: self.imem_sec_size, } } =20 fn imem_ns_load_params(&self) -> Option { Some(FalconDmaLoadTarget { + // Non-secure code always starts at offset 0. src_start: 0, dst_start: self.imem_phys_base, - len: self.imem_load_size.checked_sub(self.imem_sec_size)?, + // `imem_load_size` includes the size of the secure segment, s= o subtract it to + // get the correct amount of data to copy. + len: self.imem_load_size.saturating_sub(self.imem_sec_size), }) } =20 --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from DM1PR04CU001.outbound.protection.outlook.com (mail-centralusazon11010006.outbound.protection.outlook.com [52.101.61.6]) (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 29A8324E4B4; Fri, 6 Mar 2026 04:53:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.61.6 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772814; cv=fail; b=fIssbzXHlaZBmCCE4tTuxszqfDsQz9a85SlOnmMn++YCK9v2uKVqa9N4ng76F1nVCjJq2PuPqhxEhbe7gRvxvWFb+glfj3hmD8ciTMA/UabDtTm4xm5i2jLdN5Eo9Kjy1XjsK8aFHeSK8vkTKK2EBET2S1WJdX5C0JAzE1pHdoA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772814; c=relaxed/simple; bh=LRL4fKkbGTHsFwWvvaeGJsh7swRMMdyiejMZyngu24I=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=Dlb6V9uuwT9pnIMuIx+Tclan5S0xB32Ny6ZG+ltEZbwlrykqZ13rZF7ULXt/licUkzUINK63aDKTw67rIH+ICi6TyW/Luh7racQ8bDArVPLbFgLVzJHjMLMuuVUJ1jqLSfQaa1qDHqxm30mNYyuV2EXFIWeyUBlnfCbFpgIVR4E= 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=UxAwHRV4; arc=fail smtp.client-ip=52.101.61.6 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="UxAwHRV4" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MP8bQ1UfFun2+zYMJO92RjhYjJUcQ7gmFRD2oxwNp7o2iDgl9BvYG6G5u4FcOAQV03K241eEXKX5d/zL0n1RuPJfGKCzyYalphfDerOHEuckUmEUXfNDjOVpmVs/cfvyOvGKC6H/cVUnxnu50rfmIJ+acA1+5v7G6IGYaD4UlHodj5LhSR5XcRqPpX3xd866vHGm7Xrk2zIHbU1o9X+yHwtoJnYdhbE2F6XoHwcnE68gPD6Tep4i7ZFBrZU52x8Q8C0wVeNAgoC+k8kFMtQQKCrRQxKqS1SAYKMeMgwLAkGANxxGSWB0qrxHWjk5C8NbN8pD63JZ+aXt1I0kXASYKQ== 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=O15C/DBPYQlqJx++iId3qeGw7gKBKium15MunoMJq6k=; b=WuKh03Xbz9xXKIQftVKMCCpChwD3/rjKZhtd6NXALXSbFttydaFQFZQm5kc1dNaRKmqEa549GoA9NYVGQRg4Uk377t1tjobQRDBa1nGFBQW7LXvPaNqRIIi4b5ke7HiaugzHuOzVO4rDg6cn8vkShJ30+5l2cMmyy9CfcZXKZO7Gvh5S0mvtrIqo0JzrvF4Ej24UnXPKOk78eMir5RDDOe1SSE9Lysz3xtAYYo5ll3NxoL+EtowMVVEHvbSDl0T0Ylz3jPCe8+9zmIV1iE6Tjo/4V0No4gxzgAFR7wByD6q4+kLPiV2CKBW8tTIfHW0wsVkYfhM+HT7xSSOm7lvV7Q== 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=O15C/DBPYQlqJx++iId3qeGw7gKBKium15MunoMJq6k=; b=UxAwHRV49Dn/OG7abvcMfNvNH9kdTFdWLRPHDbL6Z5kHFRihr4IJiKiCGZXu5Pxseer6CnHQD45BCD2wvFyMMS4qsIGZVneCRboiqiUBxj0y0LGXVYiBd/mVbHZ4iQUlk8yQuLtaxke5eAqdwNToblj51JrdRAyss+nhXxEgVTdJ8cuUiXDByduny0zo6cET2eJfpyEl9a/cvtR3RgXMSYrmgMD2WIi4d+KwqZB7Tb6m5uCDC010gvMV8QmnX+n8xMe3saPatIZuaFqZeKxV7BP4rcagvtHTHVmuZcaSy0jpBPxx7d+zqn7seFSHTewU2LLCljrI7yTv8YfLKt3STQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by IA0PR12MB7554.namprd12.prod.outlook.com (2603:10b6:208:43e::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9678.18; Fri, 6 Mar 2026 04:53:26 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:53:26 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:47 +0900 Subject: [PATCH v11 10/12] gpu: nova-core: make Chipset::arch() const Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-10-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4P301CA0017.JPNP301.PROD.OUTLOOK.COM (2603:1096:405:2b1::18) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|IA0PR12MB7554:EE_ X-MS-Office365-Filtering-Correlation-Id: aeb6648c-23bb-4099-cd04-08de7b3c4d9a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|10070799003|366016; X-Microsoft-Antispam-Message-Info: UYmrQP+kbSmlJZgyj3p5JyptM8iHUsfnikqUrb2sdogeFi240R8zcCh5m6EzW9tTdTw5svTK3Rm2Zk2PghbPdh95sHM7NjzpVyRbdC/BiIkNKYnhZOezqPitNlkt2DmJoCtmMNxXy2SYKGCFbRq5mCrSaF19Q2hozNvTnJ8sESMRlwkse/jn58TFt88IdiFgdOzTNg6+Aq+XddlLXoZEMms6zFKF52eWTUwFMGxUGXCI2Egkrz9VwU+C02USh3GOvkkYrSmuSyTC2enM/iYoknzF/XaTBUlm/nJtMYUU9Jywis9lNh9rdFMkCAW60vZmpNc2KPXIYxWIqowJWdN/6s1VbmaFqsMh9nCyq+m/0sq+X/NN/mAOpAHxhuDuNUGECRHMr+Cv10WJdjHXRniZIBPBCAxzDDd4hiUTUbN2xkAv6NDRtM67jpghSMUqmZ7jAr4FXjwxkBcbkuDJb0WPFYKlOpSCQRbjepitwh3NklNHgIyKoEdBSeZpuqatTUZb1+Mi6VBVIA/xVROuvYOyx/h2X4eOErI5c4bg25lHMQrB3PjzsdwKT4Tm1ajmG5Oi7BVmlpS2C4xhT1rg2OhEyot1HnRkaeNuQOVybkoHDRjQ+VWFcZaWWrs3tDbWHAqv0PnNxMjjRyRU0v3anEQUmtTuVspUJT5jCSJf/uukheaqefI0/n3RH839MCIdKq31eXF4mqQg6Iu0RysVr7n8AaCwvrhqP5W33YbjNFza6aM= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(10070799003)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?eE9EMHhaMHZVenB2cEhYaGwvb25VMVdEYmdoNWR0MjQrcEcwcFY3SW96eVVy?= =?utf-8?B?blJtM3kvU1ovMUc0dFRXRFYwRENZUVZBYTJLZnpXK05PcHhhR29mTlpxK0F6?= =?utf-8?B?UDFNNGErUXN3bis0c0I1NzFQc2RzRURyQU9CM2o4bE5oMXBYcTc0U3g3SFgz?= =?utf-8?B?bmJ4Q3IwVUJKeERVaVlSOVFLUmU4RDc0aDViRHljSEx3N1V6czFzb0JHV3NY?= =?utf-8?B?ckJjYXI1Qld0SjZCVm8zcnF4WnNISms2ODRVVTl5UVdqOC9HQklkbVh2ZnI4?= =?utf-8?B?bmpEWm9PWmtKdHNPdm1TTW1lalllYktjbmFYOGM4V1FxMkdJcFRpb3VsenZa?= =?utf-8?B?L3N5dk0wZldwRW9ENklzOXgwOTQ5TE1LZm1JTEw4eFBiY3BpcDdodWFESVZH?= =?utf-8?B?eHJQKzR3eWJSMXNWS3NuVzYvNXVHcG1lVndPR0Y1NzB2U0FqbEozcDI5QWV5?= =?utf-8?B?RVk1MjNuMlBmSlphRXFyQy9kemROMDhKTElYZlh6RnY3MUxWZUdSeEpsNkxK?= =?utf-8?B?VGQ5UzluT0lreUtUcU5wQ2ZPRERWVGdvRkZWd2J4dENkL1d3a2taMFJudkZM?= =?utf-8?B?MHZYOUY2bW5Pa2V2T1B1SGtEak1kbFhzQ1N4WFZNcGhma1lKbE5BTER3OFQ5?= =?utf-8?B?b29kYWI4aWx4VSt1WDMvVlZxNWlaZlBqREJJWjRlcFBNazZPbHRlcFVseThu?= =?utf-8?B?czJBRGFEcXR5dU5NK1ZKRkkzMmd6MlRzcjR5TlFnbWZtMWtyTno1aDdteFk3?= =?utf-8?B?VEROSUt3NC9rRjZ1VFdYNVNzc0w3L2haQnZ5Z2ZzSHd3c1l5eE0wa3RBMFkr?= =?utf-8?B?OWJQNy9SRjYyNmxjRUpQTjNVRzJtdkViRUJiYlZGMjBjcjZDbTN2UDNuZlZ6?= =?utf-8?B?bWZramxmWGJWUVRUNnFGMDJncjJHU0Qrbk1lNnZCMHY2N0w3YUNac2hMKzdq?= =?utf-8?B?ZzZ5U2NJc2tDQTg5dXR2cW53L0I5R01kRWJsc0xsemcyWEw4K0hzMVp2RTNI?= =?utf-8?B?SXVXYVU5bGw3ZUE0blpQajBkWk1EVWJ4WnNMQzVaY0pwL3VZb2xYUE5xL2JL?= =?utf-8?B?Vjd4U3JvQkJtZG9pSEwwYXFYSGpjTGFwR3NoT3dFN0x5QWErbDZrUnBhWDY2?= =?utf-8?B?b2lkUUVEUm5SOE9pYm9OZ0hDa2JCMjl5eVZmdFg1K1pIRnc2UzlFVTA0d3ly?= =?utf-8?B?Ynp1K2sySTV2Z2tRSFlmSW1wVEdZYUtRTVozVEhzTitBcmhzTUdBbXhaZml1?= =?utf-8?B?cEtSbGd5dnV1QkxBS3JpdUE1M3JwZkhMc0Qra1J2TVAwdVBZZSszV1Y2dVdT?= =?utf-8?B?NkZLcFg3QU9YdDJ1TXV1NFYvTklUSGtNQlJDMUpNR2pwbTZZd0tnaWNXdUVv?= =?utf-8?B?T3hGNGsrT09oMG9XenZQc1l2TzVaS2wwcVFPcVFHWTVCc0V1cE9NYlRZNU13?= =?utf-8?B?bEZTYjI5WXlEV2RSVDFHMkY4bHh2RnluRzMwVmhnREZHRnF5b3ZXOVMzdG15?= =?utf-8?B?SXhKWGY5MW11d25wTFQyTkV3TmxpY3huSjNvMFNBcHFxNUd6RmFVdENxUmNr?= =?utf-8?B?T2t0aWVvamw4N1d6RkRqUWJpdXlMdHE2cjB0N0pzNEwwTVBQM2hJOUQxbTJn?= =?utf-8?B?aEJleGNlKzhJcHU2Y0VFbno0Qmw5MU82djBkY042VnNXZ1JxbDZzME1BM3FN?= =?utf-8?B?S3JSaDJzVEQxUjlUVEN5REsyeldQaHgvbVM0a1o1TlY5cDVBajY5ZU9VN2lj?= =?utf-8?B?WWUzTGFaRW9ONDVhMG1UU3JJL0NRZlBVY1psRER0Ly9uQTlzN2ZVcUJ3aGVq?= =?utf-8?B?eU1MNFoyMmh5WURWWWY2UnBYNlBkZUtjWlpFTDZBZmZNQ3RraUxuMkxDd2NF?= =?utf-8?B?UnBNenBVZGdKd2ZnVWg1aU9pcHhFZlp2SFZBNS9STHZhYXA5TnZtcjZrQzBn?= =?utf-8?B?N3dxbXZpR3lQSGx6VnBvbzhwL1RjU1NseVZBMXRsaWZOZlJMNFZxY1ZpYmxI?= =?utf-8?B?N0d4UXZWQmlhSzF6U1JoYTdzQ1N2UkpEaFI2OG5xTWowanhoMFNNNHNWYjRH?= =?utf-8?B?RUNVeHdmUE5MZGVDQ0tJZkEwdERtcjg0Z2Racm1RYk5tVHJxWWxQMUwzWmti?= =?utf-8?B?QjA1MjNRaGZQaTVzdjNDMk5xK1NYQi8zUDAxeW1paSt2RGh4RlhaK09uSk1z?= =?utf-8?B?R2pCYkljak9FYUI4NVZWRUVSMkRQeFpNOXFhOHdLME5VVG9QWTRsVTJtWXVD?= =?utf-8?B?YVdrWk5IcE1ZNXBzNFlQT1BoVUtJRTI1NHFmT25vU2F1eGlyUVBvODVoYURw?= =?utf-8?B?QksrUStGMHUyQ053RSttYnBkc2FUTmtlNDJSSWtXVXppbFc1dUNuZ2dUdlQr?= =?utf-8?Q?U7+vcY2X5u/XgMUTq90M8OhhXzJsvQOLF7F98aNTm18Wb?= X-MS-Exchange-AntiSpam-MessageData-1: N+EBxQBZVycO3Q== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: aeb6648c-23bb-4099-cd04-08de7b3c4d9a X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:53:26.4593 (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: bkPpgthSfLzBnewraCUC8ipz0+DKXodyQIqUFfkR9UmWMgK8m5zOP5aEXcPiWFEPg4CF37xctrl54EJ/CDHRhQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB7554 We will use this method from const context. Also take `self` by value since it is the size of a primitive type and implements `Copy`. Reviewed-by: Eliot Courtney Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/gpu.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 60c85fffaeaf..c14d411c6759 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -92,7 +92,7 @@ fn try_from(value: u32) -> Result { }); =20 impl Chipset { - pub(crate) fn arch(&self) -> Architecture { + pub(crate) const fn arch(self) -> Architecture { match self { Self::TU102 | Self::TU104 | Self::TU106 | Self::TU117 | Self::= TU116 =3D> { Architecture::Turing --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from DM1PR04CU001.outbound.protection.outlook.com (mail-centralusazon11010006.outbound.protection.outlook.com [52.101.61.6]) (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 D7A7C2BE048; Fri, 6 Mar 2026 04:53:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.61.6 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772816; cv=fail; b=Z1Td5xwbHEAe4pBUV2q/Vs+2pOtD9Yiepj34qooJOQLO0rwpvchMjx/HsmwUwzX52bQefS9yen6Badj275kr8qr/2byE+PoRjumHJlYC+CKQa4On3oid9hzPaZ0g2ogIRPpBBVRJW8JtiUHt4tJA/AWgB5CeEipAkfK91kOZKKY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772816; c=relaxed/simple; bh=26TV1VBYYSatGKtOzANHGnUz4HfpvbpMqswmv6neCyI=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=kyElocKlkuNgT27dw1bJQXodgnPK+s7gC0r5rYD6IIWPF1OPPEBwphEx3WexFbOZ5iCuQ9Z9B4qx3qSTm+eFhHxV3A30wDpU6AiiuKalXFJqyobdTOJUfkhJQZk1zQ1R0L1KN6HIgTm4OTJSz7nXVjr5kCOQ04gvnIPDmqljW6g= 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=K7gPldZ8; arc=fail smtp.client-ip=52.101.61.6 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="K7gPldZ8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QSxbVe84LUgkI4Wff7l4KW49alW6THeGXdsd3lHT+RajEccenYOgyoqcSK8lyA8sMRX79hO2EadQR4GNR7djugmC0/BAKDcXRnacAYWLAAw0yDX2n/rWhXCHnMZTgTZJu9e/+wQV+W5e0SW2JOBHCl4r+ERtfOZmSOOTvmGd/wgB6035inbTmFZux0cWZ4xjunFQ3DYL+fNwcY+Q4UCPDFzisc38Cubq+OxtiK9k6B5xl0p73RoeOE/ETgsHK8r4ffTrjDOQsNHTSNNrROTFonuxJluaduEqxOVTvUACfxOwvlPQbkkQgCA0MUChwvGV+ocRAaq/SARktKhBeVxJ3Q== 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=s5/RzH61K8aJHY8PQpzJBSlYnkTyygo5K2AeiHMNtvw=; b=JBNT9t2gCTkhWole1Sgyao3biSkb2OD2uvnHvbYkGUgrFZVfdGw0E8O6sEBbLeuHB+8HQOYufGv8J78j4EvrOU0ne8aro2ha384rZU7/0R8L0bt6s/F3ONe/4WayAzDcKR0alwcXlr9eCy9SD5M+F8F126SY4N1GS1yFdTYySqCYJZ4zq7vIzIznmVScL5JDF8h3tcW/Gwyj2o27REQW9pqTyMCt4o0VyvJdp6asyIHA4T+ITSIf6SdhPkBiQj4j05nkprVJr6TuMfAkytbfR1pclgc1C9/EuGJb+mw0nGWJyrIzo2TDpyPT29KbiTjFZMzaCHu5CP5MxI2G718V8w== 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=s5/RzH61K8aJHY8PQpzJBSlYnkTyygo5K2AeiHMNtvw=; b=K7gPldZ80FneOXDuLKEj5uT70/1MvAetyBNTQbRD/Oe6pVVBOOu4LpJ3jzGEy1yTOpmaARUqkblY77Q9NLJfjn4WFSjIPj1P4EaUumUd0q/JKeSKIQ27U3DgZM6fU85LDGNpA2MNVH3Os//e3Sepwt4Waje/Qc20VqHsHYojxsB42ytxdvkVjU/wUjLCqOqhvEOXFMqjx2J47FVVdcQ7aFdigHePc85OfcQ6LdTwsnMD09ReDNzGStwqE6Za+aThujLldgHSERqW2H60XRnAEfNiT+f1HdtScGV0cAKif0UFROTQ+x2B9bRQ5FPgl8X/GfRxw6kFcAwmhZiuteC2nQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by IA0PR12MB7554.namprd12.prod.outlook.com (2603:10b6:208:43e::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9678.18; Fri, 6 Mar 2026 04:53:30 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:53:30 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:48 +0900 Subject: [PATCH v11 11/12] gpu: nova-core: add gen_bootloader firmware to ModInfoBuilder Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-11-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4P286CA0066.JPNP286.PROD.OUTLOOK.COM (2603:1096:405:371::10) To CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) 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: CH2PR12MB3990:EE_|IA0PR12MB7554:EE_ X-MS-Office365-Filtering-Correlation-Id: 855050bc-a9e3-4640-4498-08de7b3c4fc2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|10070799003|366016; X-Microsoft-Antispam-Message-Info: Zo3BK+jc/BNWWR2NnELtzJz19FZ6wb12YDiSLOZCG+AUJ+UE24DOTXcVYarnT/ZbgHg149tkMDmFtqopnLKyHjVXGN02+ioqLbapcCSG9ymlQ+Q3cJpIextvfoMntkl3Wz9FgP72tI5I/sSosxt3ufhytWRnNF7gxxszdqynrQnH9iEnjB9eSI+cz6+8HJ6rP89lCkCHJimZqfBxjsEJoj390zHydD2V8qAo01v6KP+X6DooSog6zI/egygd8D9IrLtWq9uDs6OgJ9yjRmnHKrfHO0gc2IBhLqcoOSt2790e8THUuwglvugypHDPj0aBcpsEELqXo/584AW3x7zv6zTTZvoPiqsVQTzoQM4JPaIpmYXFyf2tiiZTjSd4T9eqRWM3wfj2iK+Y94wyzxUdc3D3ifzLMEvhMFVHJt1tO3uuEE9uiCYKB2y4CLHCv5ysosX1hvNKk9bQcG4WVqbpfG9i8Cshq8MM4bOnguXYdtakcKZq+QIjDX9k+Up9ZrXERfgC0QTtdWxiMiTzXBpsefzzCm6BJGIFg8egH9IuoQJfdaOo9izTD5IgTHDhqjvmB8TxVrfmEWb5qVquQqqvb0f8pcOH+zGrMSXtplMC7fjAWBMA54p2A6a0dkhllG2CFV69ETwQgZdrehD3atkp7x2jGSClEMB4Ua7obxCp4G3P+t/uIXYCE+w0Hxt3MNlwoATqcLzOMggTV98tV1lpko6sYV7a5Wc5VvBvr7f+xxk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(10070799003)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?djBTY0R6d2hDeENuZVBpYnVHN21jTnRqQmZVRCtkQU94KzNHLzhFUFRGUjY0?= =?utf-8?B?N0VhTXpjQ1NZVFlGWGk4VS9WRWJCUUk5ZGMrYXRFbUp3cHY0UjFiUlZzQjV5?= =?utf-8?B?eWRWcjZlMTR5dFA5Q1BJSTQ0R29EREZNR1dVRzdZeFpjVC9SUGE3b1dwYXNq?= =?utf-8?B?dHpmbU1SNHJtV2VFTjN5M0M2SW5OQWNIUllyNWlzUFI5MHIxVGJTYkQzOThs?= =?utf-8?B?b054MEdTUllEZlNzU3BwSnNoaVlicTkxMEQ5UzNLTUpGZnZyL1M4ZERVdDdm?= =?utf-8?B?dDg0OUdBdU1qcFVTOGtUeGdZRTZnS1d2RS9OZEFPalM1UUpkdCtBQ2orRjg1?= =?utf-8?B?elFNaVVmQmQwZVFVNkFWRXhLREYrRS8vV21kUnRvTnlEUlljNW91aUE2WC85?= =?utf-8?B?U1kwU2JwZ0k4d240aXBjd05wRXZCc1U1eUI3dlcvYTU0YzZvMjBLU1dqazds?= =?utf-8?B?cHlDUWlqUnI4SGp5RFBmbFN1cFVpU1ptUGNoUWx3ZXh6b01leUNMcDA1TnQy?= =?utf-8?B?ODA5eDR5WEc5Z09DRTFWSk1waG1ROGpPU3lncW84YkxRSXZIYjJFTmxJYmtk?= =?utf-8?B?b3VKYXV1R01PRERBYUI3cDZMb05HOUFpU1VYRERnVjNtOXN5akcwcE1NQnlE?= =?utf-8?B?aU91cVBBOU14QitGOUw2TVZ2YVZxbmVwT0RlaG8xSXMvWE5CVzB4b3krZjB2?= =?utf-8?B?WkpuWWJXcXJ0bi9DQTBYV1d2cFFqYThaVkZDLzY3c1hNbFY1b1FUVXpmWjY1?= =?utf-8?B?dldRbGRMK1gydFpKVm5ZQ2haYUVFZjZvZjJ5R2lxR095VUZRZzNEMTl1Tis1?= =?utf-8?B?cng1M3BIenUrZFlNOGZxSHlocnFuNWV0WGkxNGxvZVVrcU1sMWJ3ZXI4WE9x?= =?utf-8?B?NkVXc1pUazcyVWphaVQvamVjU2tGVUpCQzNvazM1MUJUU0JOa2ZOZmtIa3F5?= =?utf-8?B?Y0NEdStnUnUvVUMxZlVwb0JwMlo3eE9pWXJNVnpBSkcvKzZqMWFSem92NDF0?= =?utf-8?B?NWwza2VpWDdBaGoyS2hmeHVrTVIrT1JwdnVDWTJFQmR0UmRJTjZ2U3ZrSEJ2?= =?utf-8?B?SnZyaS9sZGZiUWhRRElwZ0lNMWJGSTByVHpsM2Z0MWVZV2tMVXBRTEszWmpC?= =?utf-8?B?VGQ2RE52U2NwNUJtb3FQMU5lQWxvWVBVa1gyK2dlMUhvamdxeWh1SVFXbG5X?= =?utf-8?B?Wk5mYlBhdXhBSDBvMGo3Zysrd1cvQ0xKQnRMaVRsdXJndW9rTFhFK3BueGJK?= =?utf-8?B?QkhPa0NCTXNiejlGZHJNclc5M2pUOTh3TGMwQWdSNW1BamNKdnY5VE4zdnp4?= =?utf-8?B?QmkxUmVXdng4bE5IbmtZME1ybDIzM3liVkFQUWNLbUJUQ0R2dTY2V2FseHNa?= =?utf-8?B?aGJvRGVMVXZ1TFJWaWxFNDBuWE1lSkVqOUpsVEhmbGd6cERBblJ0OWtSeUda?= =?utf-8?B?anhnRkZtUWxpemFjWG1KTDQxS1VINEkyVWMxL28vNXNNNnVzLzF3bHlMbXZU?= =?utf-8?B?bEkvN1dBUDUvRjNxZ3NUUzBObWFTR3FodnRNVk5yZWg1cmRFSk52YW02TVBL?= =?utf-8?B?QzkrU1RjNllzZDVDd3RSeHdSZkJiNUU3RFZvZGNuL29ja05mTng4RUxHWjMw?= =?utf-8?B?MW1sSGMxYndIQVoralFBQ0ZGTERqcUppSXltemZqU09ObzBOSXFYb3hXQlU2?= =?utf-8?B?bHFwcVNNM3cyLzAreTBvV2g5WlUzZ2N5WXI0UHFuNzFqd2E3TytEeDNsR0lO?= =?utf-8?B?Tk0rUW9kekNJNDUxTHd5WGd2WG5ycFFodUZ4WkZyUTExQ1FZVHJpQUdUejN2?= =?utf-8?B?TDhmY1BKeGRLMnpnSTdxUEtHNHJxeXZSVEVXWmJ0M1dkQ1NMcVpQRVR1UnU2?= =?utf-8?B?aEVXYk1RRHJxNmRHVG95emlQaGVpY0tSU1J5aHE1akdlUlJReU9nQ1RQUWtJ?= =?utf-8?B?ZHlrcnV1dm5samNZOU1iTVkvVFY0R3lXZkJpSWVsaStVajlVbWRkcW5RZTlU?= =?utf-8?B?L2QzWDlkQ3lSUzU4VkdGUEdyYTlnUVo2OUkzNXdhc05raS9rOXM0RGpXc24r?= =?utf-8?B?ckFreUFZaXd1SVpGcGpFZitTWDgzYXFPOGY0QWlHc2RGZWdTclFRS0NMV2RR?= =?utf-8?B?bGlVK3hwakNvM3BKaDhmbEQ0UnJiZDlSOSswemdJcllCV0J6SmJieUc5S1JH?= =?utf-8?B?Nk4xR0U4NU54S2xtSFRWaXJCbmlRRnljWnVocDRGd28zcHBWNmhld1c1TWkw?= =?utf-8?B?S1lyUTdwWGVRWWw3RFV1SWhMTkdWYSthMXFmN2J6VGJnUFRsUWNiV2tnanBa?= =?utf-8?B?cFpKK2ZmMmZmaWJPMW1ZTm41MENldnR2eEplZHl3MzNJdUtyL01SRnArOE82?= =?utf-8?Q?5U+9VQ8tQahvV53YNPKj5d8eAU5qdKJ77/ic50iaEbHl/?= X-MS-Exchange-AntiSpam-MessageData-1: FfmCs559OohKCw== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 855050bc-a9e3-4640-4498-08de7b3c4fc2 X-MS-Exchange-CrossTenant-AuthSource: CH2PR12MB3990.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:53:30.0899 (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: b70g3nR9Un1nHM8izE2T57BaV3QuqPWQra9n88x4jUN0v81UD+wC9lK/9LlI071aCzuAbCRVvHF3X/4+/vlsPg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB7554 Turing GPUs need an additional firmware file (the FWSEC generic bootloader) in order to initialize. Add it to `ModInfoBuilder`. Reviewed-by: Eliot Courtney Signed-off-by: Alexandre Courbot --- drivers/gpu/nova-core/firmware.rs | 21 +++++++++++++++------ drivers/gpu/nova-core/gpu.rs | 7 +++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index 5e56c09cc2df..6bd203c94b27 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -425,11 +425,20 @@ const fn make_entry_file(self, chipset: &str, fw: &st= r) -> Self { ) } =20 - const fn make_entry_chipset(self, chipset: &str) -> Self { - self.make_entry_file(chipset, "booter_load") - .make_entry_file(chipset, "booter_unload") - .make_entry_file(chipset, "bootloader") - .make_entry_file(chipset, "gsp") + const fn make_entry_chipset(self, chipset: gpu::Chipset) -> Self { + let name =3D chipset.name(); + + let this =3D self + .make_entry_file(name, "booter_load") + .make_entry_file(name, "booter_unload") + .make_entry_file(name, "bootloader") + .make_entry_file(name, "gsp"); + + if chipset.needs_fwsec_bootloader() { + this.make_entry_file(name, "gen_bootloader") + } else { + this + } } =20 pub(crate) const fn create( @@ -439,7 +448,7 @@ pub(crate) const fn create( let mut i =3D 0; =20 while i < gpu::Chipset::ALL.len() { - this =3D this.make_entry_chipset(gpu::Chipset::ALL[i].name()); + this =3D this.make_entry_chipset(gpu::Chipset::ALL[i]); i +=3D 1; } =20 diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index c14d411c6759..8579d632e717 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -105,6 +105,13 @@ pub(crate) const fn arch(self) -> Architecture { } } } + + /// Returns `true` if this chipset requires the PIO-loaded bootloader = in order to boot FWSEC. + /// + /// This includes all chipsets < GA102. + pub(crate) const fn needs_fwsec_bootloader(self) -> bool { + matches!(self.arch(), Architecture::Turing) || matches!(self, Self= ::GA100) + } } =20 // TODO --=20 2.53.0 From nobody Thu Apr 2 19:00:05 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011003.outbound.protection.outlook.com [40.107.208.3]) (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 7913933122A; Fri, 6 Mar 2026 04:53:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.3 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772820; cv=fail; b=aHfZyNcvHiCO0N+xmd613UQQw/Bs1KGkdli+dvWSrotmeOqV7xKZbQFPpNCr31DJUOb/RrBuOYPNHxYlrndvkyH58w8SdZgWxCxJGKypRsMDgJ3EmoOCI3MIm1yHqm+sRT0lIwLsIRfEWBbooaImFhIXtc5SJy+OnnSB53zKfkM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772772820; c=relaxed/simple; bh=dpzsY9U9VPL1Zzqd9V3ib64GGG11ti3ASX7Tw+iEvbA=; h=From:Date:Subject:Content-Type:Message-Id:References:In-Reply-To: To:Cc:MIME-Version; b=hlzs3+FZU94ImXcMf/bhgG7hjhYTX9w/uEKJM2zKTUojzB6b0gb0YPsB/B5sx1uncx30JvTarR7q7Y136Eo+trS3Y2oTQPswiQFFPQzo5Cyd3CPiXT8zpU65DluCNTHwfXR/496XElgkhtm1QJpVfv9cLGUm/IqWpeuGaBdzm1M= 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=mtZRd1L+; arc=fail smtp.client-ip=40.107.208.3 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="mtZRd1L+" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=fENJR9QwqN6uxWECdb+JBvhy7AMEAixTQ2JC4N/blaUtlCE1nMGD749S2VdFwOYGdd43blz75wo118aQL7aXne2fqP888BVV4pFZKZ/H+x3a/ddUO5uuION3UVC7Kr3XP7pqqRPGucDJuZBKSxNynjsBYX4Hv27JeldaQRKoD9OTEyMdRY9dtIUvuJ1BV8ZesA1fesC4RBXiHnIX//whctn/c+vz8F8eacRHghlseYfU5kbhwUDApTL9h+fssR+Ea9UMAck9ELv6PJeB+DmdR3PMGCn5boBr/OytA4KZsHxRyxO41jBviDLd/bPjwa1X6kmOpfSmi4Nkxkag2NK1tQ== 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=DLFJ4sDNJvlRBmDnNPHN7HlEI2AJTdXpa6A6FJ+7xoQ=; b=ps41vJAXGIY3h6qw3v8aTJwXSqN85J8XGdyLXU7uYN+SOgg4bV3rCt4oVCw103LRUdR1fWOqtPDyzTM4YrGbU4HttgxIC4U7oQSlmaQHaKAbgIYJ68QrU/UZdzbn5JNVpvXhsSzaFtTWRyOmkuu6e4iGBPIIEW89ETbWIfgNOE9tleZ+b32MOOZKgaIRdUtSF+8x9fxCYDJELuYVPB4+fefeFa1uQ6ojV56lImeI0BQOvEVGShr6rhqg0/44r3nrZSxhUMu0rz+fyYbG8JDjVUImBh7TGgNoV77pbuNbu1f6W2cy0zG0iV3qqk2DIpo4T5oNo5St72LSHvExExVPOQ== 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=DLFJ4sDNJvlRBmDnNPHN7HlEI2AJTdXpa6A6FJ+7xoQ=; b=mtZRd1L+vZFWsj7zc+JXC6YEPdrqv4WKT0vxn3vGgp9ytMKvttFGderrrCZPcr8DxS7ujFveSMuAbjOIiLaCkff5kLUiFRwqhQw5MIQfftOG0Hnb5X4yAO90ALSrB6x0v6w1ZlTaIqfpJbXcSwWOTlFCu5Wu/u4vCWGpTUit769hNoJ+75PT8zCz2zpamgOeoKCn2tYezLtMFbjvWXlZHO6+6PaVJxNmtMio2kDLmaSgSBUZZLdirbpZ3byb3SC5e1HhSIiBdIhtyX3xJLScaHsFWe7QgeYrrwP8tzXBTvb63Yavm0oxDcKthV6oeVTRXqJG7tnsU6R7Qfm7iGAnzQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CH2PR12MB3990.namprd12.prod.outlook.com (2603:10b6:610:28::18) by IA0PR12MB7554.namprd12.prod.outlook.com (2603:10b6:208:43e::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9678.18; Fri, 6 Mar 2026 04:53:34 +0000 Received: from CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989]) by CH2PR12MB3990.namprd12.prod.outlook.com ([fe80::7de1:4fe5:8ead:5989%6]) with mapi id 15.20.9700.003; Fri, 6 Mar 2026 04:53:34 +0000 From: Alexandre Courbot Date: Fri, 06 Mar 2026 13:52:49 +0900 Subject: [PATCH v11 12/12] gpu: nova-core: use the Generic Bootloader to boot FWSEC on Turing Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260306-turing_prep-v11-12-8f0042c5d026@nvidia.com> References: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> In-Reply-To: <20260306-turing_prep-v11-0-8f0042c5d026@nvidia.com> To: Danilo Krummrich , Alexandre Courbot , Alice Ryhl , David Airlie , Simona Vetter Cc: John Hubbard , Alistair Popple , Joel Fernandes , Timur Tabi , Edwin Peer , Eliot Courtney , nouveau@lists.freedesktop.org, rust-for-linux@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 X-ClientProxiedBy: TY4PR01CA0035.jpnprd01.prod.outlook.com (2603:1096:405:2bd::17) To MN2PR12MB3997.namprd12.prod.outlook.com (2603:10b6:208:161::11) 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: CH2PR12MB3990:EE_|IA0PR12MB7554:EE_ X-MS-Office365-Filtering-Correlation-Id: 1d031b12-61cd-4fad-8d9d-08de7b3c5222 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|376014|10070799003|366016; X-Microsoft-Antispam-Message-Info: tuKea8Ym6IWXt13JPozNdjwnzGQ/YuHAUMJwJMf1ZsB8ZXZ9PNeGg0D9bNi5XAv0D4ewAjUH7P0vGU/++nF3KUKpZne6+3kqqA2B2wWkXSaI3gPBZLMlF/WqgBJffkDLNSXlRpfs85ga1ZP5ciKtTwk4jiP3gOfJh6l5iI1DO5WPynBI2VAORNrtHGtOxCKBDKkDU05v+7nZENX+u2AsFvegx3+z475MkSw3Jo4G0R1GtufeoegxqnHfZBPKhphMxSxuxhSVnZTLzbZCqDRVgjhQ8wjt9rZEp0/9+3vUbwR1DbzyEOvJjApDxox9Mprlkw1+Ytu0XL3dljadowea7X1M5h8xIfh4LHq4AD0Z+tf3D/Kc1TfQ6NUS+jlHtz+ZoEosbP27ascUqf37Edn8N9qVcKu/2xa4/GB/J64Y+YpoWB/iCL1ZChdJCcI3PfC1O1U2hI4WhaythgM+lrlJctfdDqWWy/hzU6gsP9B7LGzrQaH2y8YJRJgVBrjdI8h0KH17hAlOOmO3etnpJWJQICK0ApG580NMg6wJ/W8HYoZF2ArASkUr4hMQeCoswae5eJxJnFrX3NpAhretkX2J6TrMbnJAN2kMVLfk1JOXj9mUSbrne27YClCQK/9ipGj5KzpUvJDjN3oqxXxAV9IKTBX6xdlMV+/wOKRS858SuJ6tdZdnYvpQR3rsKdWb+9SY3FLry9RXEvzZ6XPs2kqKFDWYJZhXyhikcWxnCgc0eJk= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CH2PR12MB3990.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(376014)(10070799003)(366016);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 2 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?U2pHMXBLenpwSGw4eXBFYzkyUTBWejhCYm5zUllpbVg3Q01yRzBoNDluK2Fl?= =?utf-8?B?RzBYQWgyYlBycEpwamhGR0owQURSSFI1V2ZjWG04TGNpOEdRbUIzTWVtQUdh?= =?utf-8?B?ZGdxRWJhTGJIUjhDdDBBM0dWQ2p2Yndmb2thUFpUUUFvSFVlYyt4bEtKdHdy?= =?utf-8?B?NHRuNCtKcjZkRTUyZjV4aWJGL3U0K1pJTlE3QVpTYjNtY0IyT2ZrM3RQZU9z?= =?utf-8?B?bDUrenl0Mnc2U21WOHo0ZGlrSGtlSXlKdVVLSzM4VkdWVmVrNndNNTZHUUZI?= =?utf-8?B?SEEyRXl1VEFreFRyMktrVGY5dm1ZeDVWeVVCQ2NWc25NTlNLNlp4ZVpWZjJi?= =?utf-8?B?U2lpMjJWL2tHNFNtejE0NUZoamp0MXlYY05ZR0t3N1VmZjZidTl5L3VMclhJ?= =?utf-8?B?bzFQbUZHTmhQYzJUYTNyVEZCZmcyZVUrMUVwQWMzSTZjLzhDL1Jxcys2VU1h?= =?utf-8?B?aDdaTGJXNkRKSkdCaU0rbmd2S0lEL1dTNGhoQ2luQ0ErY0s1aDNiVW1aV2Mr?= =?utf-8?B?R2JUUDZjNkNxK3FjWEkyK0Uwd0d2VjRGV0l5cWwwSzdCb3pYYmlsSmFiTFVi?= =?utf-8?B?bUR4eFBzQnVUaHZJeTN3OERBb2pnTEV6L2hKRjlUUXpoUFJqT29uaytzZVBj?= =?utf-8?B?cnp4dk5kOGorTTRvVTRldXpSTlpwVHU4dStjNHVES2ZGTFZ1NzB6NERrU2VB?= =?utf-8?B?YTBEZHpCOEM2dWFoOUFFeDlUSS9UOXRpTTMwQWhTVUIyMnltZFQ2azRXYjFj?= =?utf-8?B?S0VneVRaWitILy8vZHNqdEVJTzA3M21wSVdrRzNibDZkLzZhN3Juc1R2SzhZ?= =?utf-8?B?MzdabWtjOEw2M1VJRG1uRmhCQkU0UlBFalhVeis4aGh0ckxUemxrZXphcklH?= =?utf-8?B?Qzc3Y1p1V0hJYk1XeDdIZ0NhWElVOTd4MEJrczZEUGdtc25LOU9KT2RVbWpM?= =?utf-8?B?OU1MMEd4MWc4SFYxZWQ0TUJvRjQ5SEI1ZzVBYzEzSVdtQllTb2pEaDJqR2tq?= =?utf-8?B?clN1TWZhVjhTOTRGTWJyZ21TV2l6M3ZwQVZVVFRMVkkwNGZ5RmtIdjRwemJI?= =?utf-8?B?ZlFVOGwrN0luQmgyMnR1ZkZ2ME1TeGNsai8wa1JjdjNXTVlPU0dBQ3lMam9B?= =?utf-8?B?RXY0QzFEcUExTFZUeXFlUXZwRVlnaW83ODlVT3drNkQ3cXB5aVVzSk1TYkVE?= =?utf-8?B?N1g3TExBQmVhTytQMFdrSDFRR0dXejFlbmRGZ0s1TEVyRzZud1JDWVNhSjdj?= =?utf-8?B?RGZBT0xGQjdvVnhKeUs3dEl6YlhvZmpqUHNmV1BXSlMxV1FPVEZhVXZ3aDRM?= =?utf-8?B?WGFaSFMrYUN6KzFnK3BST2wwc3p6NTd6aGdqWHhqSWsyb2hrd3NDRnhPc1dF?= =?utf-8?B?SFUwZUZYMmRjTExQNFRuT01FdzdJTmNrYmtQdnlHRGxsbFFKZ2FTakxiNzZK?= =?utf-8?B?Q0gzRlBGajJjMkVSK3FUbGVCWVBQUWlQclRyMjdxWmNtWTlaSENoWWswYXJk?= =?utf-8?B?NEVPdTlRZmFhWDZSUFRYZys3ZnFyblhia3ZmUlMweTlqNFMwTlAwLzhUMEZN?= =?utf-8?B?WHpkWFhWcGh1VjNJY0FpUWsxdVdRR25yNUp0dEwwQ1pYYWtrQ1drQXljZEZR?= =?utf-8?B?WEtzc01hSW0zTnVJN1haRWlhOURsMit5Nk9FL1R0emRZQmNxUkU0UUJkcnh1?= =?utf-8?B?bjJvRk0xdzlaK093a1Z0SDcyM2VURkpmK2hWUHlpM05uVmF6ZDU5N05jYm92?= =?utf-8?B?OUp3Vy82Q3UwbkpnNEVPVlBqbWNML0JhRDViK1lLdHNYNDh6dkg4T3pMRVdQ?= =?utf-8?B?VXErbDgva0tpUnJCcVlJNktCekZmV0dkVE9qV0lBSjFBK3RXendkREpqZGRt?= =?utf-8?B?SXJSeE5BZThjNXpTbEdQMHNWK2ZoaWp6MFVOL0owV2tmelNUYnVNZWVxUFZy?= =?utf-8?B?cHhESGQ2Zm5YM01rbVNDRllOSDM4STR4Wi82aWNvQVloWmtkak42M05DL0Q5?= =?utf-8?B?SURYTEdxb3BHeEtCcGJBdXpmcFdpVk9sL3RFRzFTZkNTcVV4ZjBpdkJjdDcv?= =?utf-8?B?S1g3UGZCR08wUlFEVTNEYmxLcVZ5b0lKY1Fsa2Mxb3lFZkFrTmxoWmp0bi9p?= =?utf-8?B?bGhLbWphNFI1Y1hqY2FMOG5CbWVMQXluQTRIY25uRWZQRDhYazJHUGlWaERZ?= =?utf-8?B?V0lJRkRWYzAvcEgrcThYbGVBSGZFSk9PTXhxaEFrTmRmOTZhTmFaVU9JNEI4?= =?utf-8?B?eGp0ZjMza2dUQ0p1ZTVmODU2NTBuTTNPQzRJSGJTaTh1aGEycS80c1V0dVVz?= =?utf-8?B?Y1V2REgzSnBMcjV1MXgzRjdJSmhYWlRpUE1HNVJPR2lSYlFxZ01YaVRJTUla?= =?utf-8?Q?gxXo3PiCkXv0oP8EWGwKzHt/Y0NrOoia58ZhS238faCY8?= X-MS-Exchange-AntiSpam-MessageData-1: r7yFamvKYZpKtg== X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 1d031b12-61cd-4fad-8d9d-08de7b3c5222 X-MS-Exchange-CrossTenant-AuthSource: MN2PR12MB3997.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Mar 2026 04:53:34.5825 (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: Mmb1fiwk1/GhgM97HMs+TzEREAichgJxNJDS2VgRfYg4A95qs97s2I6axh8qJDUCuE0ii2HDf08KDK5DMTKIog== X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB7554 From: Timur Tabi On Turing and GA100, a new firmware image called the Generic Bootloader (gen_bootloader) must be used to load FWSEC into Falcon memory. The driver loads the generic bootloader into Falcon IMEM, passes a descriptor that points to FWSEC using DMEM, and then boots the generic bootloader. The bootloader will then load FWSEC into IMEM and boot it. Signed-off-by: Timur Tabi Co-developed-by: Alexandre Courbot Signed-off-by: Alexandre Courbot Reviewed-by: Eliot Courtney --- drivers/gpu/nova-core/firmware/fwsec.rs | 6 + drivers/gpu/nova-core/firmware/fwsec/bootloader.rs | 348 +++++++++++++++++= ++++ drivers/gpu/nova-core/gsp/boot.rs | 15 +- 3 files changed, 366 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/nova-core/firmware/fwsec.rs b/drivers/gpu/nova-cor= e/firmware/fwsec.rs index 87495d1d6cac..fb2bb14b9b33 100644 --- a/drivers/gpu/nova-core/firmware/fwsec.rs +++ b/drivers/gpu/nova-core/firmware/fwsec.rs @@ -10,6 +10,8 @@ //! - The command to be run, as this firmware can perform several tasks ; //! - The ucode signature, so the GSP falcon can run FWSEC in HS mode. =20 +pub(crate) mod bootloader; + use core::marker::PhantomData; =20 use kernel::{ @@ -385,6 +387,10 @@ pub(crate) fn new( } =20 /// Loads the FWSEC firmware into `falcon` and execute it. + /// + /// This must only be called on chipsets that do not need the FWSEC bo= otloader (i.e., where + /// [`Chipset::needs_fwsec_bootloader()`](crate::gpu::Chipset::needs_f= wsec_bootloader) returns + /// `false`). On chipsets that do, use [`bootloader::FwsecFirmwareWith= Bl`] instead. pub(crate) fn run( &self, dev: &Device, diff --git a/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs b/drivers/g= pu/nova-core/firmware/fwsec/bootloader.rs new file mode 100644 index 000000000000..b106bae170ca --- /dev/null +++ b/drivers/gpu/nova-core/firmware/fwsec/bootloader.rs @@ -0,0 +1,348 @@ +// SPDX-License-Identifier: GPL-2.0 + +//! Bootloader support for the FWSEC firmware. +//! +//! On Turing, the FWSEC firmware is not loaded directly, but is instead l= oaded through a small +//! bootloader program that performs the required DMA operations. This boo= tloader itself needs to +//! be loaded using PIO. + +use kernel::{ + alloc::KVec, + device::{ + self, + Device, // + }, + prelude::*, + ptr::{ + Alignable, + Alignment, // + }, + sizes, + transmute::{ + AsBytes, + FromBytes, // + }, +}; + +use crate::{ + dma::DmaObject, + driver::Bar0, + falcon::{ + self, + gsp::Gsp, + Falcon, + FalconBromParams, + FalconDmaLoadable, + FalconEngine, + FalconFbifMemType, + FalconFbifTarget, + FalconFirmware, + FalconPioDmemLoadTarget, + FalconPioImemLoadTarget, + FalconPioLoadable, // + }, + firmware::{ + fwsec::FwsecFirmware, + request_firmware, + BinHdr, + FIRMWARE_VERSION, // + }, + gpu::Chipset, + num::FromSafeCast, + regs, +}; + +/// Descriptor used by RM to figure out the requirements of the boot loade= r. +/// +/// Most of its fields appear to be legacy and carry incorrect values, so = they are left unused. +#[repr(C)] +#[derive(Debug, Clone)] +struct BootloaderDesc { + /// Starting tag of bootloader. + start_tag: u32, + /// DMEM load offset - unused here as we always load at offset `0`. + _dmem_load_off: u32, + /// Offset of code section in the image. Unused as there is only one s= ection in the bootloader + /// binary. + _code_off: u32, + /// Size of code section in the image. + code_size: u32, + /// Offset of data section in the image. Unused as we build the data s= ection ourselves. + _data_off: u32, + /// Size of data section in the image. Unused as we build the data sec= tion ourselves. + _data_size: u32, +} +// SAFETY: any byte sequence is valid for this struct. +unsafe impl FromBytes for BootloaderDesc {} + +/// Structure used by the boot-loader to load the rest of the code. +/// +/// This has to be filled by the GPU driver and copied into DMEM at offset +/// [`BootloaderDesc.dmem_load_off`]. +#[repr(C, packed)] +#[derive(Debug, Clone)] +struct BootloaderDmemDescV2 { + /// Reserved, should always be first element. + reserved: [u32; 4], + /// 16B signature for secure code, 0s if no secure code. + signature: [u32; 4], + /// DMA context used by the bootloader while loading code/data. + ctx_dma: u32, + /// 256B-aligned physical FB address where code is located. + code_dma_base: u64, + /// Offset from `code_dma_base` where the non-secure code is located. + /// + /// Also used as destination IMEM offset of non-secure code as the DMA= firmware object is + /// expected to be a mirror image of its loaded state. + /// + /// Must be multiple of 256. + non_sec_code_off: u32, + /// Size of the non-secure code part. + non_sec_code_size: u32, + /// Offset from `code_dma_base` where the secure code is located (must= be multiple of 256). + /// + /// Also used as destination IMEM offset of secure code as the DMA fir= mware object is expected + /// to be a mirror image of its loaded state. + /// + /// Must be multiple of 256. + sec_code_off: u32, + /// Size of the secure code part. + sec_code_size: u32, + /// Code entry point invoked by the bootloader after code is loaded. + code_entry_point: u32, + /// 256B-aligned physical FB address where data is located. + data_dma_base: u64, + /// Size of data block (should be multiple of 256B). + data_size: u32, + /// Number of arguments to be passed to the target firmware being load= ed. + argc: u32, + /// Arguments to be passed to the target firmware being loaded. + argv: u32, +} +// SAFETY: This struct doesn't contain uninitialized bytes and doesn't hav= e interior mutability. +unsafe impl AsBytes for BootloaderDmemDescV2 {} + +/// Wrapper for [`FwsecFirmware`] that includes the bootloader performing = the actual load +/// operation. +pub(crate) struct FwsecFirmwareWithBl { + /// DMA object the bootloader will copy the firmware from. + _firmware_dma: DmaObject, + /// Code of the bootloader to be loaded into non-secure IMEM. + ucode: KVec, + /// Descriptor to be loaded into DMEM for the bootloader to read. + dmem_desc: BootloaderDmemDescV2, + /// Range-validated start offset of the firmware code in IMEM. + imem_dst_start: u16, + /// BROM parameters of the loaded firmware. + brom_params: FalconBromParams, + /// Range-validated `desc.start_tag`. + start_tag: u16, +} + +impl FwsecFirmwareWithBl { + /// Loads the bootloader firmware for `dev` and `chipset`, and wrap `f= irmware` so it can be + /// loaded using it. + pub(crate) fn new( + firmware: FwsecFirmware, + dev: &Device, + chipset: Chipset, + ) -> Result { + let fw =3D request_firmware(dev, chipset, "gen_bootloader", FIRMWA= RE_VERSION)?; + let hdr =3D fw + .data() + .get(0..size_of::()) + .and_then(BinHdr::from_bytes_copy) + .ok_or(EINVAL)?; + + let desc =3D { + let desc_offset =3D usize::from_safe_cast(hdr.header_offset); + + fw.data() + .get(desc_offset..) + .and_then(BootloaderDesc::from_bytes_copy_prefix) + .ok_or(EINVAL)? + .0 + }; + + let ucode =3D { + let ucode_start =3D usize::from_safe_cast(hdr.data_offset); + let code_size =3D usize::from_safe_cast(desc.code_size); + // Align to falcon block size (256 bytes). + let aligned_code_size =3D code_size + .align_up(Alignment::new::<{ falcon::MEM_BLOCK_ALIGNMENT }= >()) + .ok_or(EINVAL)?; + + let mut ucode =3D KVec::with_capacity(aligned_code_size, GFP_K= ERNEL)?; + ucode.extend_from_slice( + fw.data() + .get(ucode_start..ucode_start + code_size) + .ok_or(EINVAL)?, + GFP_KERNEL, + )?; + ucode.resize(aligned_code_size, 0, GFP_KERNEL)?; + + ucode + }; + + // `BootloaderDmemDescV2` expects the source to be a mirror image = of the destination + // and uses the same offset parameter for both. + // + // Thus, the start of the source object needs to be padded with th= e difference betwen + // the destination and source offsets. + // + // In practice, this is expected to always be zero but is required= for code + // correctness. + let (align_padding, firmware_dma) =3D { + let align_padding =3D { + let imem_sec =3D firmware.imem_sec_load_params(); + + imem_sec + .dst_start + .checked_sub(imem_sec.src_start) + .map(usize::from_safe_cast) + .ok_or(EOVERFLOW)? + }; + + let mut firmware_obj =3D KVVec::new(); + firmware_obj.extend_with(align_padding, 0u8, GFP_KERNEL)?; + firmware_obj.extend_from_slice(firmware.ucode.0.as_slice(), GF= P_KERNEL)?; + + ( + align_padding, + DmaObject::from_data(dev, firmware_obj.as_slice())?, + ) + }; + + let dmem_desc =3D { + // Bootloader payload is in non-coherent system memory. + const FALCON_DMAIDX_PHYS_SYS_NCOH: u32 =3D 4; + + let imem_sec =3D firmware.imem_sec_load_params(); + let imem_ns =3D firmware.imem_ns_load_params().ok_or(EINVAL)?; + let dmem =3D firmware.dmem_load_params(); + + // The bootloader does not have a data destination offset fiel= d and copies the data at + // the start of DMEM, so it can only be used if the destinatio= n offset of the firmware + // is 0. + if dmem.dst_start !=3D 0 { + return Err(EINVAL); + } + + BootloaderDmemDescV2 { + reserved: [0; 4], + signature: [0; 4], + ctx_dma: FALCON_DMAIDX_PHYS_SYS_NCOH, + code_dma_base: firmware_dma.dma_handle(), + // `dst_start` is also valid as the source offset since th= e firmware DMA object is + // a mirror image of the target IMEM layout. + non_sec_code_off: imem_ns.dst_start, + non_sec_code_size: imem_ns.len, + // `dst_start` is also valid as the source offset since th= e firmware DMA object is + // a mirror image of the target IMEM layout. + sec_code_off: imem_sec.dst_start, + sec_code_size: imem_sec.len, + code_entry_point: 0, + // Start of data section is the added padding + the DMEM `= src_start` field. + data_dma_base: firmware_dma + .dma_handle() + .checked_add(u64::from_safe_cast(align_padding)) + .and_then(|offset| offset.checked_add(dmem.src_start.i= nto())) + .ok_or(EOVERFLOW)?, + data_size: dmem.len, + argc: 0, + argv: 0, + } + }; + + // The bootloader's code must be loaded in the area right below th= e first 64K of IMEM. + const BOOTLOADER_LOAD_CEILING: usize =3D sizes::SZ_64K; + let imem_dst_start =3D BOOTLOADER_LOAD_CEILING + .checked_sub(ucode.len()) + .ok_or(EOVERFLOW)?; + + Ok(Self { + _firmware_dma: firmware_dma, + ucode, + dmem_desc, + brom_params: firmware.brom_params(), + imem_dst_start: u16::try_from(imem_dst_start)?, + start_tag: u16::try_from(desc.start_tag)?, + }) + } + + /// Loads the bootloader into `falcon` and execute it. + /// + /// The bootloader will load the FWSEC firmware and then execute it. T= his function returns + /// after FWSEC has reached completion. + pub(crate) fn run( + &self, + dev: &Device, + falcon: &Falcon, + bar: &Bar0, + ) -> Result<()> { + // Reset falcon, load the firmware, and run it. + falcon + .reset(bar) + .inspect_err(|e| dev_err!(dev, "Failed to reset GSP falcon: {:= ?}\n", e))?; + falcon + .pio_load(bar, self) + .inspect_err(|e| dev_err!(dev, "Failed to load FWSEC firmware:= {:?}\n", e))?; + + // Configure DMA index for the bootloader to fetch the FWSEC firmw= are from system memory. + regs::NV_PFALCON_FBIF_TRANSCFG::try_update( + bar, + &Gsp::ID, + usize::from_safe_cast(self.dmem_desc.ctx_dma), + |v| { + v.set_target(FalconFbifTarget::CoherentSysmem) + .set_mem_type(FalconFbifMemType::Physical) + }, + )?; + + let (mbox0, _) =3D falcon + .boot(bar, Some(0), None) + .inspect_err(|e| dev_err!(dev, "Failed to boot FWSEC firmware:= {:?}\n", e))?; + if mbox0 !=3D 0 { + dev_err!(dev, "FWSEC firmware returned error {}\n", mbox0); + Err(EIO) + } else { + Ok(()) + } + } +} + +impl FalconFirmware for FwsecFirmwareWithBl { + type Target =3D Gsp; + + fn brom_params(&self) -> FalconBromParams { + self.brom_params.clone() + } + + fn boot_addr(&self) -> u32 { + // On V2 platforms, the boot address is extracted from the generic= bootloader, because the + // gbl is what actually copies FWSEC into memory, so that is what = needs to be booted. + u32::from(self.start_tag) << 8 + } +} + +impl FalconPioLoadable for FwsecFirmwareWithBl { + fn imem_sec_load_params(&self) -> Option> { + None + } + + fn imem_ns_load_params(&self) -> Option> { + Some(FalconPioImemLoadTarget { + data: self.ucode.as_ref(), + dst_start: self.imem_dst_start, + secure: false, + start_tag: self.start_tag, + }) + } + + fn dmem_load_params(&self) -> FalconPioDmemLoadTarget<'_> { + FalconPioDmemLoadTarget { + data: self.dmem_desc.as_bytes(), + dst_start: 0, + } + } +} diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index 78957ed8814f..9a00ddb922ac 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -24,6 +24,7 @@ BooterKind, // }, fwsec::{ + bootloader::FwsecFirmwareWithBl, FwsecCommand, FwsecFirmware, // }, @@ -48,6 +49,7 @@ impl super::Gsp { /// created the WPR2 region. fn run_fwsec_frts( dev: &device::Device, + chipset: Chipset, falcon: &Falcon, bar: &Bar0, bios: &Vbios, @@ -63,6 +65,7 @@ fn run_fwsec_frts( return Err(EBUSY); } =20 + // FWSEC-FRTS will create the WPR2 region. let fwsec_frts =3D FwsecFirmware::new( dev, falcon, @@ -74,8 +77,14 @@ fn run_fwsec_frts( }, )?; =20 - // Run FWSEC-FRTS to create the WPR2 region. - fwsec_frts.run(dev, falcon, bar)?; + if chipset.needs_fwsec_bootloader() { + let fwsec_frts_bl =3D FwsecFirmwareWithBl::new(fwsec_frts, dev= , chipset)?; + // Load and run the bootloader, which will load FWSEC-FRTS and= run it. + fwsec_frts_bl.run(dev, falcon, bar)?; + } else { + // Load and run FWSEC-FRTS directly. + fwsec_frts.run(dev, falcon, bar)?; + } =20 // SCRATCH_E contains the error code for FWSEC-FRTS. let frts_status =3D regs::NV_PBUS_SW_SCRATCH_0E_FRTS_ERR::read(bar= ).frts_err_code(); @@ -144,7 +153,7 @@ pub(crate) fn boot( let fb_layout =3D FbLayout::new(chipset, bar, &gsp_fw)?; dev_dbg!(dev, "{:#x?}\n", fb_layout); =20 - Self::run_fwsec_frts(dev, gsp_falcon, bar, &bios, &fb_layout)?; + Self::run_fwsec_frts(dev, chipset, gsp_falcon, bar, &bios, &fb_lay= out)?; =20 let booter_loader =3D BooterFirmware::new( dev, --=20 2.53.0