From nobody Fri Sep 25 10:37:46 2026 Received: from MW6PR02CU001.outbound.protection.outlook.com (mail-westus2azon11012046.outbound.protection.outlook.com [52.101.48.46]) (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 0B54E3E7BB0 for ; Mon, 14 Sep 2026 07:49:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.48.46 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372196; cv=fail; b=gA1oWXkICRWW4n8gGOQq6P+5xxxQIS9Rds/jkX3v3d0v/OLzJ8AKoFmfdNb9yVKU8mpOrllm6N7xabFwv7yYHSVAgo70MUiSdoKaezRAazY4zsEaZ/q7CUsWEyQTDgLbq1K3i31bXyhsHsaN7OBDxhFkU2e//ICG0yU4yPJjWL4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372196; c=relaxed/simple; bh=qvWNNcZ70sQmvwi5pltV22bZXwYvRigRZ2cogFzCEm0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uUsTBW/ni4ENQUQspD20qAmrDsmIjbX6y+N2s0l0bSRZ+Id9Nqbq5KY6LWs/0rYao4dQWmnvci/rdnZ3iM46yhJxlgvbn/Q+/4rbcWmM+tOXkKkyN3lw7fWRdXpxKgLCM+KuWXK/cewN85iC9p0/1v7OeoAmrpwrJluvjYeEw94= 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=HOgPlXU+; arc=fail smtp.client-ip=52.101.48.46 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="HOgPlXU+" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=slNG3jVsOFGtg60PlHJOGRXOI6uuptaa1NQpLy8wI4n5AlT2nq/y2ZaZ8ZZAaB8K3/re5Xn2gXXIk6IOL2ZxjVb24uzzZtajfAw7V37Qd2KSiAQ/dgdnvyhPliGxvtBTIatSlVYD0RenvCVjG/Nv5Nw8ioPWV9TXs3Ai5tJVMjubZB5zwGDcOnkbWoyb3BLakON0yZmW7OzQcYqSJHfvdConKrPWn+FwWQ/HeNbozGaQGp/hL8kNkafKEgsGCqZkfoCGUx2ucvnWzQA8Df9GCPHkXfIT4vLU4Tuf4XWhEygWugE4YDWKUMxX57PqRIys/ICJhGnLNt3BfFAa/cu70Q== 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=Z3ZBzRfd3bVu7x6HteFzJvPiWQqOLJwEh7AgJNPdAaM=; b=EWaBhTDpfdTobhyVOx9K2DeTl6Ien2M2ICXhT2s0JRTx5mfFpkXHopYmkUb54UXmLZrlaKJ67o1nt2AjDaqnDJhwRyAvzg/OrlJyoV3BjqBPdqxO8mDD0xHIuKG7lb5AeOOgGxy1zXf/g+dkR3nUmgcJu1Z1i5Y30Od7rP6PkfUgJbwUuHjShItSIwEYcohANzhUAahYbVunpSnMrj62IRF63AJRS6dAs7Z6F13cvJVHYjoFPHMZnvFsyivMD3us6+nYPeVdNTDj0ICnUpTTe00LF5mHZLqwbCADCEX5JHgEXbjv9P5XI2izc24uA4twB/DCcXwn8lTexnFbjaQXrQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=Z3ZBzRfd3bVu7x6HteFzJvPiWQqOLJwEh7AgJNPdAaM=; b=HOgPlXU+7xA9yoh5uwaCHncQRRDH0rzR9AUsKC4tiG4H9R5lbSeYi1hQMNdo6JgW0kBaAJLCC/NyZejA5oKn63vhgQiE2uEz7Cqz16XXLdpn9VdSoVHIIhzYN9NJBTodajiq1+bCTlf+qKyYXCgiHdYJ09toHUeTn5BsptCmWJzsRLKipxz4I1ORwzffVu6QMG2xJExA7ZzlcqImQhyG3lwqpPqlGCT9omD/4Jbl3ROiLPOCmu9/zjK/w5JNNjvHbLXkodlaw12CUmrhjqLnuimsUNanqsx01oUw3SqsH4xtpNM/zQMPH/N7SoJKvlhmBbCKxHoKkzNtp+1wkJiaGw== Received: from BN9PR03CA0635.namprd03.prod.outlook.com (2603:10b6:408:13b::10) by PH7PR12MB7306.namprd12.prod.outlook.com (2603:10b6:510:20a::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.9; Mon, 14 Sep 2026 07:49:46 +0000 Received: from BN2PEPF0000A891.namprd04.prod.outlook.com (2603:10b6:408:13b:cafe::97) by BN9PR03CA0635.outlook.office365.com (2603:10b6:408:13b::10) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:49:46 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF0000A891.mail.protection.outlook.com (10.167.248.183) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:49:46 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:49:29 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:49:28 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:49:20 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 01/32] gpu: nova-core: gsp: pass boot context through setup helpers Date: Mon, 14 Sep 2026 10:48:36 +0300 Message-ID: <20260914074907.1399629-2-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000A891:EE_|PH7PR12MB7306:EE_ X-MS-Office365-Filtering-Correlation-Id: a86dcf38-89b5-434b-c34a-08df1234bf07 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|23010399003|36860700016|82310400026|3023799007|10067099003|6133799003|56012099006|11063799006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: GjakcYiFF9TOXuWyEQWknvHLBSIVWzJrOMWqLwCdbKYXAyQxQDY+Mia0ckcSVUNrLsV1ydKnJHFRL3NwmMozzmLrdrVhxJbFMPpJ8obAC2Ae00HAHIITKKoUd9F3IwBwHc0PQB9AlpmcTrbt6O7fH8fLHVMW76zRRFXl3rdhttsH9NROJs87Vk+H30jA/OLXAWADBptJT2uByrlsFyDRhR7a0isEB07JHGlPJ8ZVSAoiHigyXcntQJDXCwUWv5j51zExRY7nlHirF3Xgf9x/bHRhjpmlZqIdau5AhzjirRoSNwesbKiSjnuYSwMYA2puTXZ+i6aEvRxgCZVp4/IdhOBPITVsw5QNB8vtXijMPu03LHYj3VPN4IRCND1mwty+VjjVPtuHwgjW4jxkowTcOue5OMz45ZDecemWJ9j6U6q8QG2cGrzmkwSAbrfuYJEjzzHE2XYAVPJfz0cS0aRHaZako4GN2WNeYnjshsRDoIOunj7RGDgf3w6uA/7/Ymi2QVrCk+gOTOVC9jXczW1+7lZo9k6hUBEwu6h2nwibONhd1fk7vt7jZPbQZ6DNb509seA8dOSq6TL6zCXc8PIW81TwZhUPj6xhoLksWb9Rf+nfFEs6PEyWQZL5cZX8VogrtZv956jJ+f/iUvM2CuqRJeKWNrD5k4CSgfw0KF7eEJZOUmmVf35dldm9Sj6/jbzxBUv92PUj5Jo6OM70criCHA== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(23010399003)(36860700016)(82310400026)(3023799007)(10067099003)(6133799003)(56012099006)(11063799006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: fYH3CMbT1GdjhvS6vDpaYOkV61gGHn08Ed+ooFiWWXokNnFEkIttDYaoZJ0fpYrpzldmZCzk+K+n6mRlJ1ovQEZgxhnEWb9v9+XvyXwpHpQT2NcZ9jmtMjXGEpqpMdam43NND8A1/EuM4L+Q33JozRevxrysKICDFvtIz4Y5lfVkqYmSF6tMB3X7m6RoFfyznaT3XQntO+NUQ0BluC3Ra5NDVZP2jePlVC6YiUXz+DHcPx8E8QYHZvASN3UnX/gRy92GDaw1dqVWEl1Ds8xwW7zxZ8PkNLQDZfmuOf6D1Y1euUTp6fNMZPE55nGnaj7qWgM1T5s1xE10doZ2A+30oiAknVmVdgM686IgC8SoOE6kiaUSwt1y3Su8NxjYHUw/TnqCreigAHWho5ncODjSY70W9UxI1xCMyxM3bOFp4kYXAWnqMzDsSAwfLtcRuiQx X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:49:46.0695 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a86dcf38-89b5-434b-c34a-08df1234bf07 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000A891.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7306 Content-Type: text/plain; charset="utf-8" GSP boot unpacks the device, chipset, BAR and vGPU state from its context only to pass them to framebuffer setup and GSP_INIT helpers. The callers duplicate which context fields each helper needs. Pass GspBootContext through the framebuffer sizing and GSP_INIT payload helpers. Read the device and mode where they are used, including the VF topology and WPR2 heap helpers. Keep mode detection, ownership and firmware values unchanged. No functional change is intended. Cc: Alexandre Courbot Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/fb.rs | 26 +++++++++++--------------- drivers/gpu/nova-core/gsp/boot.rs | 2 +- drivers/gpu/nova-core/gsp/commands.rs | 25 +++++++++---------------- drivers/gpu/nova-core/gsp/hal/gh100.rs | 2 +- drivers/gpu/nova-core/gsp/hal/tu102.rs | 2 +- 5 files changed, 23 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/nova-core/fb.rs b/drivers/gpu/nova-core/fb.rs index 5ceb7760c78e..26e94d908b77 100644 --- a/drivers/gpu/nova-core/fb.rs +++ b/drivers/gpu/nova-core/fb.rs @@ -174,13 +174,9 @@ pub(crate) struct FbRanges { =20 impl FbRanges { /// Computes concrete framebuffer ranges required on non-FSP booting a= rchitectures. - pub(crate) fn new( - chipset: Chipset, - bar: Bar0<'_>, - gsp_fw: &GspFirmware<'_>, - vgpu_state: VgpuState, - ) -> Result { - let hal =3D hal::fb_hal(chipset); + pub(crate) fn new(ctx: &gsp::GspBootContext<'_, '_>, gsp_fw: &GspFirmw= are<'_>) -> Result { + let bar =3D ctx.bar; + let hal =3D hal::fb_hal(ctx.chipset); =20 let fb =3D { let fb_size =3D hal.vidmem_size(bar); @@ -242,7 +238,7 @@ pub(crate) fn new( FbRange(fw_image_addr..fw_image_addr + fw_image_size) }; =20 - let (vf_partition_count, wpr2_heap_size) =3D wpr2_heap_params(chip= set, vgpu_state, fb.end)?; + let (vf_partition_count, wpr2_heap_size) =3D wpr2_heap_params(ctx,= fb.end)?; =20 let wpr2_heap =3D { const WPR2_HEAP_DOWN_ALIGN: Alignment =3D Alignment::SZ_1M; @@ -298,11 +294,11 @@ pub(crate) fn wpr2_range(bar: Bar0<'_>) -> Option> { } =20 /// Computes the number of VF partitions and the WPR2 heap size from the v= GPU state. -fn wpr2_heap_params(chipset: Chipset, vgpu_state: VgpuState, fb_size: u64)= -> Result<(u8, u64)> { - Ok(match vgpu_state { +fn wpr2_heap_params(ctx: &gsp::GspBootContext<'_, '_>, fb_size: u64) -> Re= sult<(u8, u64)> { + Ok(match ctx.vgpu.state() { VgpuState::Disabled =3D> ( 0, - gsp::LibosParams::from_chipset(chipset).wpr_heap_size(chipset,= fb_size)?, + gsp::LibosParams::from_chipset(ctx.chipset).wpr_heap_size(ctx.= chipset, fb_size)?, ), VgpuState::Enabled { total_vfs } =3D> ( u8::try_from(total_vfs.get()).map_err(|_| EINVAL)?, @@ -328,10 +324,10 @@ pub(crate) struct FbSizes { =20 impl FbSizes { /// Computes the framebuffer region sizes for GSP-FMC boot. - pub(crate) fn new(chipset: Chipset, bar: Bar0<'_>, vgpu_state: VgpuSta= te) -> Result { - let hal =3D hal::fb_hal(chipset); - let fb_size =3D hal.vidmem_size(bar); - let (vf_partition_count, wpr2_heap_size) =3D wpr2_heap_params(chip= set, vgpu_state, fb_size)?; + pub(crate) fn new(ctx: &gsp::GspBootContext<'_, '_>) -> Result { + let hal =3D hal::fb_hal(ctx.chipset); + let fb_size =3D hal.vidmem_size(ctx.bar); + let (vf_partition_count, wpr2_heap_size) =3D wpr2_heap_params(ctx,= fb_size)?; =20 Ok(Self { frts_size: hal.frts_size(), diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index 38ab737ad798..fa879685bac5 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -123,7 +123,7 @@ pub(crate) fn boot( =20 // GSP-RM discards any RPC that reaches it before GSP_INIT, so the= system information // and the registry keys go inside that one request. - let init_payload =3D commands::build_gsp_init_payload(pdev, chipse= t, ctx.vgpu.state())?; + let init_payload =3D commands::build_gsp_init_payload(ctx)?; let bootloader =3D if super::hal::uses_generic_bootloader(chipset)= { Some(GenericBootloader::new(dev, chipset, gsp_falcon)?) } else { diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index 6d250548c165..ce1761c2f398 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -8,14 +8,12 @@ }; =20 use kernel::{ - device, pci, prelude::*, transmute::AsBytes, // }; =20 use crate::{ - gpu::Chipset, gsp::{ cmdq::{ Cmdq, @@ -40,6 +38,7 @@ Encoder, UnknownKeyPolicy, // }, + GspBootContext, }, sbuffer::SBufferIter, vgpu::VgpuState, // @@ -103,37 +102,31 @@ pub(crate) fn gpu_name(&self) -> core::result::Result= <&str, GpuNameError> { /// - `ENODEV` if vGPU mode is enabled but the SR-IOV capability is missin= g. /// /// Errors reading the PCI configuration or decoding the VF BAR layout are= propagated as-is. -pub(crate) fn build_gsp_init_payload( - pdev: &pci::Device, - chipset: Chipset, - vgpu_state: VgpuState, -) -> Result { +pub(super) fn build_gsp_init_payload(ctx: &GspBootContext<'_, '_>) -> Resu= lt { let mut regkeys =3D KVVec::new(); for &(name, value) in REGISTRY_ENTRIES { regkeys.push(RegKey::new(name, value), GFP_KERNEL)?; } - if matches!(vgpu_state, VgpuState::Enabled { .. }) { + if matches!(ctx.vgpu.state(), VgpuState::Enabled { .. }) { regkeys.push(RegKey::new(b"RMSetSriovMode\0", 1), GFP_KERNEL)?; } =20 - let vf_info =3D build_vf_info(pdev, vgpu_state)?; + let vf_info =3D build_vf_info(ctx)?; =20 let mut encoder =3D Encoder::new(); - GspInitRequest::new(pdev, chipset, regkeys, vf_info).encode(&mut encod= er)?; + GspInitRequest::new(ctx.pdev, ctx.chipset, regkeys, vf_info).encode(&m= ut encoder)?; =20 Ok(encoder.finish()) } =20 /// Builds the optional VF topology portion of the `GSP_INIT` request. -fn build_vf_info( - pdev: &pci::Device, - vgpu_state: VgpuState, -) -> Result> { - let VgpuState::Enabled { total_vfs } =3D vgpu_state else { +fn build_vf_info(ctx: &GspBootContext<'_, '_>) -> Result> { + let VgpuState::Enabled { total_vfs } =3D ctx.vgpu.state() else { return Ok(None); }; =20 - let sriov =3D pdev + let sriov =3D ctx + .pdev .config_space_extended()? .find_ext_capability::()? .ok_or(ENODEV)?; diff --git a/drivers/gpu/nova-core/gsp/hal/gh100.rs b/drivers/gpu/nova-core= /gsp/hal/gh100.rs index 91201b51030e..f91cdd061706 100644 --- a/drivers/gpu/nova-core/gsp/hal/gh100.rs +++ b/drivers/gpu/nova-core/gsp/hal/gh100.rs @@ -151,7 +151,7 @@ fn boot<'gpu>( let chipset =3D ctx.chipset; let gsp_falcon =3D ctx.gsp_falcon; =20 - let fb_sizes =3D FbSizes::new(chipset, ctx.bar, ctx.vgpu.state())?; + let fb_sizes =3D FbSizes::new(ctx)?; dev_dbg!(dev, "{:#x?}\n", fb_sizes); =20 let wpr_meta =3D diff --git a/drivers/gpu/nova-core/gsp/hal/tu102.rs b/drivers/gpu/nova-core= /gsp/hal/tu102.rs index bbdcf754ec13..c3a87e5c7e0b 100644 --- a/drivers/gpu/nova-core/gsp/hal/tu102.rs +++ b/drivers/gpu/nova-core/gsp/hal/tu102.rs @@ -259,7 +259,7 @@ fn boot<'gpu>( let gsp_falcon =3D ctx.gsp_falcon; let sec2_falcon =3D ctx.sec2_falcon; =20 - let fb_ranges =3D FbRanges::new(chipset, bar, gsp_fw, ctx.vgpu.sta= te())?; + let fb_ranges =3D FbRanges::new(ctx, gsp_fw)?; dev_dbg!(dev, "{:#x?}\n", fb_ranges); =20 // Declared before the unload guard so that if Booter fails while = running, SEC2 is reset From nobody Fri Sep 25 10:37:46 2026 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010020.outbound.protection.outlook.com [52.101.46.20]) (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 1FE53360ED1 for ; Mon, 14 Sep 2026 07:50:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.20 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372206; cv=fail; b=rcpv9DqwEcQEhYyKMx0cciNInVDGZD8D1RxwyCj3cK5fZh9ZISe/V+H6GGg1Ft27MaKG1QYKQq8yM5WaYeGYVUqxi4CtSByHNcxkQNJIhjPm4aEIQzzWTNpbSnmTlgSPxvQfdLEuzBRPj2+4SykNUdE0c0ukad2915A2qiQV1r0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372206; c=relaxed/simple; bh=yPNKaN3X7yIKW4EKQu9X5cgI+FuH29w/QATnXpN2gGc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=d6wgwJ+4EqEaD2HKtBLpZD54MI65yTK8I5vRy6w0auXlqviM9amHituBAZaB1z5u57sSStvylV1ijjnrX+/JqKToI4Dt82ye6KM4VODwCBHGTveAnzWo1Q4JxSD62cxBOwAkA4CnytnKNCuy+WzhzJZF3zCDDzMOm3RSvJReEhE= 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=f2ygSC9E; arc=fail smtp.client-ip=52.101.46.20 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="f2ygSC9E" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=NJeNwA5jpXVoLZQaOFfdX7Y/YZasESFSCMWZysSElLtbjYRG6ytJqhf2YWx+yi1vu+VNeNcYm0ejryc4Mbj9hE849mF94HO4BcZGy1HZ2xqysJtziV6O0iGnbKfOoTpG3UdNUmoMbXpPIE8Q6zEVYFTxZQs+xRMqm8oTCCbehMOQ83xCHkfGK7q8MLYzpF2Qw6UuTeNf/OdcrgLzLzvgmjVGRsE2IZVPB4H/eHLvJ4u4AkSWNEy3BvozEdN+cIhNKh6lnV66lt99oPr5xwJpdb4DYiq1XgaY60oKpS+5rmQYxQTLI7f6fsjPmfx2fe9YJyaOSoKG1PGT2P8c7vRiNw== 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=Tl+TwmJzmUM6T63IGRO5Mj9RX+XnrSVbB6W5Tg+cxiA=; b=JucT66DSQqXK6fRDlivhiAUN53gvkYoH3BSSrZAq5BD1qtG5JkOXW7Olhqq3d1Wj1I97pxc3C/l7wxdhfOo82LgeVdWxhprMxc5hQXoIlLzbIqjev1gY+9nmNRcja5LwqDSGq1HROjcAiub4Ihkn3H+ulDwK+D7MQakqZy8zaZuQllyW3wApioK6vI7dOBg6LvQ183gZAMGUiT8xYIJbEuCHl2RTJNqqtLMXvQ/JPIwtMe3PU4+hQccJFzBmZy0uBJDlUlxm4C/P/GM1IOMRI16bHUABh+3v/5YSh8o+JqU/U+u41NHkwVMNSVV5BC2PAvJx4Zj+v00gWG+lNhg+dQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=Tl+TwmJzmUM6T63IGRO5Mj9RX+XnrSVbB6W5Tg+cxiA=; b=f2ygSC9EkeyXCcZuZGAQnLyrHvE/NWRVq5pEJ1znew2HZN8IFNebFhUfgLxEfE0r5utnmqtBxvgPa3E2WdeEiXytaZxuj98ePJaywcr6XCs29+x7KIMcVi6NK//zx0GhrPLV6OIPDT82svu74gcOOVeUv+dEi0qEi/IBlWejoNv6Efdq0t9Xy3YPEQaoZ7uoFH3JiM7qCKIma5ERyoitvM794hAEG3RujYK28RQaizQZbiZxUYnL/3jBpEzigfefmRcgHqWoBMNxyNhCaTnaVtCvPTqgJtSbIgMsSuOxvU/dFF9I+qmvcfv2pmZaGWsn2zXn+/6E/weX0cLWeu3EKw== Received: from BN0PR03CA0040.namprd03.prod.outlook.com (2603:10b6:408:e7::15) by MW4PR12MB7358.namprd12.prod.outlook.com (2603:10b6:303:22b::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:49:55 +0000 Received: from BN3PEPF00022BCD.namprd03.prod.outlook.com (2603:10b6:408:e7:cafe::89) by BN0PR03CA0040.outlook.office365.com (2603:10b6:408:e7::15) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:49:55 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN3PEPF00022BCD.mail.protection.outlook.com (10.167.248.169) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:49:54 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:49:38 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:49:36 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:49:28 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 02/32] gpu: nova-core: gsp: decouple boot context from VgpuManager Date: Mon, 14 Sep 2026 10:48:37 +0300 Message-ID: <20260914074907.1399629-3-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF00022BCD:EE_|MW4PR12MB7358:EE_ X-MS-Office365-Filtering-Correlation-Id: b85af9ea-44d9-46dc-fb79-08df1234c458 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|82310400026|36860700016|1800799024|23010399003|56012099006|11063799006|3023799007|10067099003|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: KSyKJbIQHiLu0ZUJgiYfzcSJZTWJBnjik+LDNtOdkumuk1oVN2u/I6bkImIgvSrODdetVbI/75L5KqoqtyJVX8u4FFtXdwq1qqXpOlmRoE9p/1fHoG3HGZl/OJbUpOunzfMudaXR6EtWq41MoMsaO1EDzx4YchGhIVMHB6e5b0gVvDu+s1kHBOaBWGhrr1QNTVJehIIrvDJ/2xIVcU0+N747KwoBxvn//sWmosE5EuLpLDg27VnFITKISDISQKNup6Ke8M8uXMN6FrH312o5RdtEbfRs7RhVLo9S7Wv4T4xq4OQkasgSRn/jGoX9pUDozj4O5uQ3/6tHsjbZpPi8qkrVUVvp2pHO0JJWhxxJb/NZSG+ceTK1TGJng75wR/ZBw46j/frhE9BF5ccEZ2oMKe9fGCAvvDgVA17fX2NYgQTzMlwdyWEKOZ8JAz5YUFZdcbP9UO8LfUWe0Y7efA7ui9fG7SFzxzmmv/sz83wjTH/ny+qmwhJf1MIOStw46fkL96bi9rRrvVv7TYw3D3FbRQHcFGbdM1fxVX66BQcnvZJqOzjHlDi9qt1OuSXtP18FojngqcxrQZOS2YqesV7F94gmR4Aok/C11NdiDbesVDor1GTT0Uy7AF/4LXXpeMT6FeVZ3cg5+KcsGZGM4dmL1dFLAeGMRPObVf+Xo9SBv4mU6c6YSrtuFZHZJVVegijNpzz+whduCM8NpbwyUDtIMw== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(7416014)(376014)(82310400026)(36860700016)(1800799024)(23010399003)(56012099006)(11063799006)(3023799007)(10067099003)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: flhnLWz56uYWUMO0A43/2NvqNM+lt8u9B1on3fzjdFCNjEWiImSo1rs+OEwN5WFUbHdyXMm07Q0v9U/hhJmOz4Kf5LmW7iJMK36LWq3PWGiF0mzLHFcZJ3b4KOXxsKW8PDRodfIqkiCzTs3o3cLMxBA5RXOfWc4zBeOxgISgr2jmrWPIwxcNu560uXlEghfgY/5+4IFiuTP1QPqdiITozeeL27J/D6gpgBCmv2e0k0DXaQ+xAGzc45so1pFb2QAfyycBXZeUD6qzzjbJzUzP78vaQvBTK2UxxOaMu/HErzp2vLnPWXm62vaw4dCQanFzDCNdh3MSGG5lCmetyObu2gAZkUsvT/ig6jmsO6XuE8bHxN5IpIq1yZCTcCYrDqOoH2879BDTHOflH8P184vnnIrC1X3qD0UShAjWMEG9jkjkO933lmLyDwXxOLjxnM7B X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:49:54.9888 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b85af9ea-44d9-46dc-fb79-08df1234c458 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF00022BCD.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB7358 Content-Type: text/plain; charset="utf-8" GSP boot uses the detected vGPU mode to size firmware resources and populate GSP_INIT. Carrying the whole manager in the boot and unload context couples these operations to its runtime interface. The boot code only needs read access to the mode, and unloading does not use the manager. A short state borrow is sufficient for both context construction sites. Make GspBootContext borrow VgpuState directly and read it in the framebuffer and GSP_INIT helpers. Return a state reference from the manager without changing mode detection or the values passed to firmware. No functional change is intended. Cc: Alexandre Courbot Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/fb.rs | 2 +- drivers/gpu/nova-core/gpu.rs | 4 ++-- drivers/gpu/nova-core/gsp.rs | 4 ++-- drivers/gpu/nova-core/gsp/commands.rs | 4 ++-- drivers/gpu/nova-core/vgpu.rs | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/nova-core/fb.rs b/drivers/gpu/nova-core/fb.rs index 26e94d908b77..882827bcfd3a 100644 --- a/drivers/gpu/nova-core/fb.rs +++ b/drivers/gpu/nova-core/fb.rs @@ -295,7 +295,7 @@ pub(crate) fn wpr2_range(bar: Bar0<'_>) -> Option> { =20 /// Computes the number of VF partitions and the WPR2 heap size from the v= GPU state. fn wpr2_heap_params(ctx: &gsp::GspBootContext<'_, '_>, fb_size: u64) -> Re= sult<(u8, u64)> { - Ok(match ctx.vgpu.state() { + Ok(match *ctx.vgpu_state { VgpuState::Disabled =3D> ( 0, gsp::LibosParams::from_chipset(ctx.chipset).wpr_heap_size(ctx.= chipset, fb_size)?, diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 4b562a8687b6..cf24c0d00173 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -359,7 +359,7 @@ fn drop(self: Pin<&mut Self>) { gsp_falcon: &*this.gsp_falcon, sec2_falcon: &*this.sec2_falcon, fsp: this.fsp.as_mut(), - vgpu: &*this.vgpu, + vgpu_state: this.vgpu.state(), }, bundle, ) @@ -424,7 +424,7 @@ pub(crate) fn new<'a>( gsp_falcon, sec2_falcon, fsp: fsp.as_mut(), - vgpu, + vgpu_state: vgpu.state(), })?, }), =20 diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index d043954fe4a7..93291c67d6de 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -49,7 +49,7 @@ fw::GspArgumentsPadded, // }, num, - vgpu::VgpuManager, // + vgpu::VgpuState, // }; =20 pub(crate) const GSP_PAGE_SHIFT: usize =3D 12; @@ -68,7 +68,7 @@ pub(crate) struct GspBootContext<'ctx, 'gpu> { pub(crate) gsp_falcon: &'ctx Falcon<'gpu, GspFalcon>, pub(crate) sec2_falcon: &'ctx Falcon<'gpu, Sec2Falcon>, pub(crate) fsp: Option<&'ctx mut Fsp<'gpu>>, - pub(crate) vgpu: &'ctx VgpuManager, + pub(crate) vgpu_state: &'ctx VgpuState, } =20 impl<'ctx, 'gpu> GspBootContext<'ctx, 'gpu> { diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index ce1761c2f398..09223bc3b793 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -107,7 +107,7 @@ pub(super) fn build_gsp_init_payload(ctx: &GspBootConte= xt<'_, '_>) -> Result) -> Result) -> Result> { - let VgpuState::Enabled { total_vfs } =3D ctx.vgpu.state() else { + let VgpuState::Enabled { total_vfs } =3D *ctx.vgpu_state else { return Ok(None); }; =20 diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs index 6b7e045acea8..905b3a7331fd 100644 --- a/drivers/gpu/nova-core/vgpu.rs +++ b/drivers/gpu/nova-core/vgpu.rs @@ -85,7 +85,7 @@ fn detect_state( } =20 /// Returns the detected vGPU state for this boot. - pub(crate) fn state(&self) -> VgpuState { - self.state + pub(crate) fn state(&self) -> &VgpuState { + &self.state } } From nobody Fri Sep 25 10:37:46 2026 Received: from SJ2PR03CU001.outbound.protection.outlook.com (mail-westusazon11012037.outbound.protection.outlook.com [52.101.43.37]) (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 C15053E5EEC for ; Mon, 14 Sep 2026 07:50:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.43.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372209; cv=fail; b=URovdsSOkrDnooSZHb9ATy0bzi+JatCkztj2q19MHSy7z3e3hCF9jlo4qZyJ+1BLJfqiXbSTn0qSEGXD1T3YYRt8h/mPz1FQNe0gO/6T9AAOLfQWwQT59XZM6qmtf+ao6pqqWFnrwrMiS7Ktu6ywCLQhbj7rZ3X5jdmAHtPetWI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372209; c=relaxed/simple; bh=D2w9ieCOwpSl+y3ev7W94+UIu77HrVazFiz8Jw9YIE4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ramZn390tqxLf1vxailsgLQIUSYK+TGnFKMijJav85yYM3FKNKvcmmqtuGNc+pDXLN9zOmfa2wlWmcg1thLk0RMqj2b4Y82j0zcGYLAK5IoM8aVeuuZIiEOfyMFEqmHVtO6VzwN7tAz9kcfN7XUNDgAYXKjwlo+EtGV9P6O81CE= 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=gB1axsCb; arc=fail smtp.client-ip=52.101.43.37 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="gB1axsCb" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=JhOe+mj6FyZKq5ZDPLC2IP4LnbX3c4eYPt0VoNstL1UT/pWpkyUa1UAH0Q/98YxNLgMHI6dks3vUD4BSlHy6R+62p8iyYHn7lo5ckvf+OiRGq13p0ZmHfJwWwDjetPlrT5D3T9hpwpO6T0wIHgkJf+82v9ZzXkERIKXVpOznC36gMk5kloXHmCZnrVU7Zl8TYOWi2qkJsnawPyXVrLWu/lF+SzuqEb+tRt/PvaP7EIh5vHj0w3bJtARCaq+kWonst0XKtcfN+VdPVxMiZX7fZW2N+d0e1tcRF9XzQ4U7ugZdlKSJlSevGtJ1qYy+S6I2n4xC8M7jxDoAX2AjkOKGWA== 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=sZlFnjAUY+DdfCQTQhKq5jvB6TEg8jM4bUKSbJQ+2+g=; b=WFsd0rs3ZGwyH7yBNO75xWfz+Gr1mASq1kWk5OC5dyHP92kOK1+5OIsk1GCrNFBTluqwsEUK3myM71dO6bF7gPW802RrGpRhb6A8JFW/NQyNQR2YtkmaJ+Oi7pC8BLClrBVcN0JrcRmFzqSR64PYUaOdDXtv4DN2JiDgzpj7tRpPUbboy32Vd3J8qDyrNkNZckY0O9is1hp5lf7cdbaSAHbuRLKLSL+IuMxu8K5N1GqP1JgTmgOLR1p5Ss9+SYsd5K04RHPE2V49VEKi3tPBaTKi/bboOvtRxiiGyM94giZnDYfhI3ePTGk1L/woAueqX0MauPx6OITDW4o31JCh/A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=sZlFnjAUY+DdfCQTQhKq5jvB6TEg8jM4bUKSbJQ+2+g=; b=gB1axsCbx5hQMa5OsqipPLvR+QYg91lKnSyWTjkj91x4gngDmgrLDjl7lj0hs9aPCqdmiFXoefC39Css5rcbnHm+cwcWrUfotLqPnvzFpIkj+qQdXKGnZgQYhHzI6Mlqu885UobsFjV4Tm0oQ/ci+mhulEfsoctKiBSc/vD7RmeTozxHBAVNrWrL+INNF+NuJgckGyjRTuQW5syEazc9N8UZewDVLlg9ATgRYnJamQkDG2HRyx8LsYPxXD0/1by5Jew1HxBcek7QflX6891iqZZQt/NQ40FhBWD8GOIBDesmR8qAgk/32UuRiSJXhpb3Kbu3CBaQI41PJnMDNDDPYw== Received: from BN0PR03CA0039.namprd03.prod.outlook.com (2603:10b6:408:e7::14) by SA3PR12MB8047.namprd12.prod.outlook.com (2603:10b6:806:31b::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:50:02 +0000 Received: from BN3PEPF00022BCD.namprd03.prod.outlook.com (2603:10b6:408:e7:cafe::c) by BN0PR03CA0039.outlook.office365.com (2603:10b6:408:e7::14) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:50:02 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN3PEPF00022BCD.mail.protection.outlook.com (10.167.248.169) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:50:01 +0000 Received: from rnnvmail203.nvidia.com (10.129.68.9) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:49:46 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail203.nvidia.com (10.129.68.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:49:45 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:49:37 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 03/32] gpu: nova-core: vgpu: detect boot state independently Date: Mon, 14 Sep 2026 10:48:38 +0300 Message-ID: <20260914074907.1399629-4-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN3PEPF00022BCD:EE_|SA3PR12MB8047:EE_ X-MS-Office365-Filtering-Correlation-Id: 9e469415-ee56-4949-9740-08df1234c87d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|82310400026|1800799024|23010399003|36860700016|10067099003|11063799006|56012099006|18002099003|22082099003; X-Microsoft-Antispam-Message-Info: y/hlWy0pKUgJ3oNMH2KYOWNKyjzuORmDeUrX/8BKxsuI8V1dYY5z3bXNPpPT7IrwtrcF8UyWORwX1slrZJg6eC90sePT6LkW4t961qL2MbNjrAMJdfQFzanu/kTox2xkZjoTCew2guS34LUzMPwaFACANurZxDvpcZj/bTVV+aErRRVl8JoBZyYjKxcSCYqWdeQCVyJdhUHs4nB6z3hRko3Kdbk9gNn9+kwZBUuM/GsI+OKGxRYurvjjUzqQxh+nnjX04dGbfeuTv37LrAcpVJ07JIJXa3gynwOsmPt+JEVaXvto8HVN6GTXe84zCJJZT+Gdnvm/9fUMz3W/YzMEh3bLxuTTar2SRrhNzVVb1XWHriyTaGzaomU/2b0wBCrujuQYbpEnGhqwu1HNSsvOUajNzH4zM2Hyaau0A1qhDNTs6Gbkpr3FI2eMuTIFjbtNXmufp/29/FCW/EFEn/6m6hJYJnfCsWU/vb8bF2cyUGXCnU8jvdy69pSVAPwfcDXHAAtjW5MmaPGBji2VdajLdHhUxqWkoMIwnKz/cGK55dxxNkzeohiRQqnPHbSP2PGdZvShdn+TkZMdQ3H37vr7vnyj+7wqQlivkusY2CTFha+vQAXr8G2MZ+YjEMtXZcAwMFTK25qod1K/3bWQltKN4cG0CX+jLRg5GKyQlPul8yFZZG7+VZxwvPZ567c8NHM5GP/+NtsEqmjiJTHBx3PQhA== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(7416014)(376014)(82310400026)(1800799024)(23010399003)(36860700016)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: UR0tr5E9frRfTghyM7jN07yuLRCk6q5HpOMDFqiiuCo8/SZ5y/h7XfIIC4hIvZfj5cJvJ+8Fd16rpehX59+qjAfAO8Dp+1LzSK0zX6QbysyHurwDrCT0Xo5B0rnxKKnVCak5xi0UyIb1Y1TekQEKejd/0JCFESL/Ai6JJ9jPxx/korjd6LBaxqtcBDuug1EGdKIVnPwYVpJRFmoFgob9g91dQVSN3RnyBe2Y3dWWu/NR8WIyC9Cw2v/O+pwZTZzZitsPvDB3R18Z8Gi0ye9RCSOdls2z3g5SUhsJo97Rpbut4p/oPhyquz2upPPxKRCxmougZvd3zJCDSpbna705HFh8MQqtO3UfhosTGzowPGqsJqj/yN5C2Bw38UgVyLBddvB2X3yoXN+h5y9Vjpa/eZq8J7akkBidb4GQtwyqegJPS5fJTZkdHKtOKIlhhkp2 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:50:01.9291 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9e469415-ee56-4949-9740-08df1234c87d X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN3PEPF00022BCD.namprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA3PR12MB8047 Content-Type: text/plain; charset="utf-8" The vGPU manager currently contains only the detected boot mode. Its construction couples mode detection to an object with no runtime management responsibilities. Firmware setup needs the mode before allocating GSP resources, even when vGPU is disabled. Keeping that value with GspResources also makes it available throughout the firmware lifecycle without a manager. Move detection to VgpuState and store its result in GspResources. Borrow it directly when constructing the boot and unload contexts, and remove the state-only manager wrapper. Preserve the FSP query order, existing diagnostics and disabled fallback. No functional change is intended. Cc: Alexandre Courbot Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gpu.rs | 11 +++++------ drivers/gpu/nova-core/vgpu.rs | 25 ++++++++----------------- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index cf24c0d00173..39e9e4ab0be6 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -48,7 +48,7 @@ GpuMm, VramAddress, // }, - vgpu::VgpuManager, // + vgpu::VgpuState, // }; =20 #[cfg_attr(not(CONFIG_KUNIT =3D "y"), expect(dead_code))] @@ -294,8 +294,7 @@ struct GspResources<'gpu> { // TODO: use different resource types for each boot method, and make t= he relevant Gsp methods // generic against them. fsp: Option>, - /// vGPU state detected before GSP boot. - vgpu: VgpuManager, + vgpu_state: VgpuState, /// GSP runtime data. #[pin] gsp: Gsp<'gpu>, @@ -359,7 +358,7 @@ fn drop(self: Pin<&mut Self>) { gsp_falcon: &*this.gsp_falcon, sec2_falcon: &*this.sec2_falcon, fsp: this.fsp.as_mut(), - vgpu_state: this.vgpu.state(), + vgpu_state: this.vgpu_state, }, bundle, ) @@ -410,7 +409,7 @@ pub(crate) fn new<'a>( =20 fsp: Fsp::try_new(dev, bar, spec.chipset)?, =20 - vgpu: VgpuManager::new(pdev, spec.chipset, fsp.as_mut()), + vgpu_state: VgpuState::detect(pdev, spec.chipset, fsp.as_m= ut()), =20 gsp <- Gsp::new(pdev, bar), =20 @@ -424,7 +423,7 @@ pub(crate) fn new<'a>( gsp_falcon, sec2_falcon, fsp: fsp.as_mut(), - vgpu_state: vgpu.state(), + vgpu_state, })?, }), =20 diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs index 905b3a7331fd..b405ba49c490 100644 --- a/drivers/gpu/nova-core/vgpu.rs +++ b/drivers/gpu/nova-core/vgpu.rs @@ -30,19 +30,16 @@ pub(crate) enum VgpuState { }, } =20 -/// vGPU state manager. -pub(crate) struct VgpuManager { - state: VgpuState, -} - -impl VgpuManager { - /// Creates a vGPU manager by querying SR-IOV and the FSP PRC vGPU kno= b. - pub(crate) fn new( +impl VgpuState { + /// Detects the boot mode, falling back to disabled if querying the de= vice fails. + /// + /// Call after creating the FSP and before allocating GSP firmware res= ources. + pub(crate) fn detect( pdev: &pci::Device>, chipset: Chipset, fsp: Option<&mut Fsp<'_>>, ) -> Self { - let state =3D Self::detect_state(pdev, chipset, fsp).unwrap_or_els= e(|e| { + let state =3D Self::query_state(pdev, chipset, fsp).unwrap_or_else= (|e| { dev_warn!( pdev, "vGPU state detection failed: {:?}; disabling vGPU\n", @@ -51,12 +48,11 @@ pub(crate) fn new( VgpuState::Disabled }); dev_dbg!(pdev, "vGPU state: {:?}\n", state); - - Self { state } + state } =20 /// Detects the vGPU state from the chipset, SR-IOV capability and FSP= PRC knob. - fn detect_state( + fn query_state( pdev: &pci::Device>, chipset: Chipset, fsp: Option<&mut Fsp<'_>>, @@ -83,9 +79,4 @@ fn detect_state( VgpuMode::Disabled =3D> Ok(VgpuState::Disabled), } } - - /// Returns the detected vGPU state for this boot. - pub(crate) fn state(&self) -> &VgpuState { - &self.state - } } From nobody Fri Sep 25 10:37:46 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010059.outbound.protection.outlook.com [40.93.198.59]) (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 858393E9C36 for ; Mon, 14 Sep 2026 07:50:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.59 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372215; cv=fail; b=ifoduhQTa221DG1gKinRgAij0RAOY4GfmhRPhRlEOdnDNCO9yPbCwpu9knpBIvUltNmfXMnL8p2WqADUgjYkO8Mh+9L2GBlKjPBRHSqVpKxTiPaRbShxTwuUQUcVy53lOqXToaegK/kPicZeByNHeOe0OAIEPE8RzutHCaOWnPA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372215; c=relaxed/simple; bh=Q3mPPQzSXCMB+VEPZduTd85jTMNrNfgUfF8LecZJyw0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Q1q54i2E997Uafh5il/t+rUvm3LRulroUvOpQ3tubDmQT8fMmtUDEsiMmKkEdi2d/niJzV9Vn28TX3pOPyLxuQzO7N5rK4X+iOB/tntasjNl2m/DMlU8i18/i5PaesVljZH8W0KNFtm9amVwGjKKaX8qQJIkCtVzeJJTnSuy8qg= 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=d8qgTn61; arc=fail smtp.client-ip=40.93.198.59 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="d8qgTn61" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Lgtv29ZXZdSDZuK2w76grd58TMN+lgSd/VZf+fzOPamBpoIUDN76m8X0ZWDch5hTltrv9Dm375I9JoAwcqwgKC3GlhFhtCZEuYdWJndIS6ekLwix8ik7qVpV1GjoKtxjDNY6w0+hopOk2AzptrbhtTt+yCrikn5VAuxNnY/5vFpCwP+SPCga5lcLMBMmpOnw4gFW6Dsg64h1CNStcLk8zP4ABg9ZKCtIr+cTwJwdLGjOK9lN6dNh8lDtJDtH4NjpVlafdV5qKCm92hxmSQeVg/IhcoOgmlg7wAviH720TDuda472wNLPAUPnvRfoCh/7NEtJsB5EQGCX8zqFpFQhJQ== 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=Q5BHFcA1CSyqLUyrWG27+J5Yagirz1BkuE6vcqFrY4A=; b=pVHc/V/7mLPivWb84/pLKf6sJYnRqFlHASVPs6fApoavpGj7k1fWFxwJmdZ2wUgZbsKKIUdR8W/gPED57IUDuuDZyCte3o97GFmvcvqd9ngW75kqXfU9MUytU03mLNY8Rnqq/T1jNWZnO0FD9hGA7Hns2sWiJtrlzTq7DdSgqWvq5rz63MnOCcXf+Eveq7tI1Osbx2a8N/r2RKRdUvPQEc9Gmx0SvZAfslOAfKQv6y46vzBblDiYq6Xm6pvrqqJ56iohTK6oz/uw/MvRoxlmBQSOqelHxG+BBKXXDYnKUSECEyvjdtQdorS9rxVF5OxB+jUjzVYLcRoEqDmJQEAz/g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=Q5BHFcA1CSyqLUyrWG27+J5Yagirz1BkuE6vcqFrY4A=; b=d8qgTn61BQuwXvISkG7W653lGNmlH3p0YV1jbegVFZsulBArRNI6afL8xN4AZeA6k+ixAreZ0nWOZUkcOrZGIfPDynRXtoUb+0Hh3KTojqYGLjxUYrq+cbmGYxLKTzL8GxqKKRWTtrDdAJSxJTl5rzztJ7cWRauDwiaBDK9NMND4PP17pB77jKw1IweYmJeUgwLOgoPZJGAT6qHS8XfVlS3MRVDdUb1VgDeLHkrQr8BDwD8byLaO1beA6oZrIxfH4TybidF0VHk1nzNZVEW8RhyTr+Km/GDCvnrOmg92m3tkzNRlBm6wX6hWsnxvCj057C9SewespZxxenNvL3DdcQ== Received: from BN9PR03CA0508.namprd03.prod.outlook.com (2603:10b6:408:130::33) by DM6PR12MB4435.namprd12.prod.outlook.com (2603:10b6:5:2a6::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:50:08 +0000 Received: from BN2PEPF0000A892.namprd04.prod.outlook.com (2603:10b6:408:130:cafe::7e) by BN9PR03CA0508.outlook.office365.com (2603:10b6:408:130::33) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:50:07 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF0000A892.mail.protection.outlook.com (10.167.248.184) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:50:07 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:49:54 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:49:53 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:49:46 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 04/32] gpu: nova-core: gpu: add a channel ID pool for vGPU Date: Mon, 14 Sep 2026 10:48:39 +0300 Message-ID: <20260914074907.1399629-5-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000A892:EE_|DM6PR12MB4435:EE_ X-MS-Office365-Filtering-Correlation-Id: 283df39b-fc6f-4a1a-b930-08df1234cbf0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|30052699003|23010399003|36860700016|7416014|376014|1800799024|82310400026|56012099006|11063799006|10067099003|22082099003|18002099003|6133799003; X-Microsoft-Antispam-Message-Info: uMQ8uJ9E4FzgRSc7jWQQpl5on6f5cfigPUMu/Wm7ERwV6l5rSGudjbCCpt67/+peKccrGyRbQXuZe+V2WFCTfFaIJNQ2UgHrQGQK6lOjdy7RzIrNnH32lVueONeX4J/Xqi+MyK7Lv2+CajR6fMH1ZgmJinx0N2dOEYFZ4MqmZXUdaAnApklZLWV+0sgXCoiGAbZ2fx9lr8TbwldngTdXl05ixiXRsk0nnsws1bNJxZvA5IOlL6Qjqb+lZgOMYuJNe7y81vRrL/r5TQXAr5YiwHkBosmfSG4NsP56ugatE0AvkagqPvS4gH1QoT0AI2xOivssZNel0h6NoH0zd6JB7ah95USXRODRU17IV3Im4zZiQlNKQA4jgvFhQrPgZtw55GmR9ZabvgH1kAv47Cpcz6uMX2nbkhFeu6HGKJCj6FwURuaem8JEuOdCNHju4nLFJtpRN5fnusuZCSufGWQUlPaE185oWK4ydIm5IKM/YV1Jr/UEkZI0R5O5IYcm2fzEJKAqivkOQFM19uWVIOQe0CI48pVjXI0m3fuymgoIXBwLZMqT7VqpMCbfHdBpOX4sEdU6sTNDgkB3/PyZvTbR7mL8RH+drXqvIMJ1FbvXHSMB8x5hogEbQ/SYKU7yZzxHYI0NNz4g9viueyzbPcHL77unwFhahZGYg3LQ7brJIeV99XIeFRHM6Vh8qKMI7OPqS94iT041MzBd4bAv/dkTIA== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(30052699003)(23010399003)(36860700016)(7416014)(376014)(1800799024)(82310400026)(56012099006)(11063799006)(10067099003)(22082099003)(18002099003)(6133799003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: RoUd2AoGhWp/L1K8QdAodLHguGckppoRWzo9iUc5rw8uiC3PzlE/s2ZmKwN6CRW2TfoIj5RhkHw+Vy3AGk08BrCh/yJPDB5gjlB5X6ywCwCk2AIHAJ+bd9oCuO1cehDbNOSwcoFbtQGhL+upSrqgwRFEl0kt/+WPS11/DurODmW7sXOtlAAPeZT9Slv2Zgg+fGki6uXcoFbpPbJfe4/kFMm7vY7YJ/Y2I6V/BWpVBENuWSQmsZPvgf9k49BTlX1gzCbojQv0msCGK1icYgAWlIiWtOk5K7WoKzczOZtrfvpVlMh2r6DX8k/2q6RsMkZ0hB9s1bSQRgVacoAsqFBnrzH/gKcSb/mYztM8+00FFPW1xT9i+s0aF8KBJ6p0+mMTJHvnpgplsAFevm+1ClKo5RviFlqyobORUZ2otwxNIgK1xzq7e+YNrfrSOTJq4job X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:50:07.7241 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 283df39b-fc6f-4a1a-b930-08df1234cbf0 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000A892.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4435 Content-Type: text/plain; charset="utf-8" Channel ID reservations need a GPU-owned pool shared by vGPU instances. The existing allocator is not instantiated by Gpu, leaving no common pool from which consumers can reserve per-VF ranges. The pool must remain at a stable address while its reservations exist. Its storage also needs to remain available throughout GPU cleanup. Create a private pinned ChannelIdPool with a single 2048-channel capacity constant. Initialize it before GSP resources and declare it after them so that it survives both their normal destruction and initialization rollback. No channel reservations are made here. Cc: Alexandre Courbot Suggested-by: Eliot Courtney Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gpu.rs | 9 +++++++++ drivers/gpu/nova-core/gpu/channel.rs | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 39e9e4ab0be6..733a2c09ec01 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -48,6 +48,7 @@ GpuMm, VramAddress, // }, + num, vgpu::VgpuState, // }; =20 @@ -56,6 +57,10 @@ mod hal; mod regs; =20 +use self::channel::TOTAL_CHANNELS; + +pub(crate) use self::channel::ChannelIdPool; + macro_rules! define_chipset { ({ $($variant:ident =3D $value:expr),* $(,)* }) =3D> { @@ -322,6 +327,8 @@ pub(crate) struct Gpu<'gpu> { /// GSP and its resources. #[pin] gsp_resources: GspResources<'gpu>, + #[pin] + chid_pool: ChannelIdPool, /// System memory page required for flushing all pending GPU-side memo= ry writes done through /// PCIE into system memory, via sysmembar (A GPU-initiated HW memory-= barrier operation). /// @@ -396,6 +403,8 @@ pub(crate) fn new<'a>( // Initialize this early because `gsp_resources` depends on it. sysmem_flush: SysmemFlush::register(dev, bar, spec.chipset)?, =20 + chid_pool <- ChannelIdPool::new(cv!(num::u32_as_usize(TOTAL_CH= ANNELS))), + gsp_resources <- try_pin_init!(GspResources { device: pdev, =20 diff --git a/drivers/gpu/nova-core/gpu/channel.rs b/drivers/gpu/nova-core/g= pu/channel.rs index 485efaba059d..75666c6768e6 100644 --- a/drivers/gpu/nova-core/gpu/channel.rs +++ b/drivers/gpu/nova-core/gpu/channel.rs @@ -21,6 +21,10 @@ }, // }; =20 +// TODO: Query the channel capacity through GMCAPI once an equivalent of +// NV2080_CTRL_CMD_INTERNAL_FIFO_GET_NUM_CHANNELS is available. +pub(super) const TOTAL_CHANNELS: u32 =3D 2048; + /// Pool for tracking reservations of channel IDs. #[pin_data] pub(crate) struct ChannelIdPool { From nobody Fri Sep 25 10:37:46 2026 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011034.outbound.protection.outlook.com [40.93.194.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 468A338DC72 for ; Mon, 14 Sep 2026 07:50:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.34 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372222; cv=fail; b=ppImnNeGL8Kz2Dccij6GTUFjKtF/d9rWSRBS/6ngcGIR35LjwvJq4fK2n7dqt7equxI6B3z4D89CaiYkDuacbmN6zCVgjjqUBkvsemDAAKiKlSf8ExcvQqyihdjzR+gfgQNFtUAGmLyCxXGRcYmNEPXi0yij4gf58mVl5vBFrl8= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372222; c=relaxed/simple; bh=g7lCmH7zU8M6yMQjV5KeLvXdvuZojL6m16AbnCnRpO8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XHCvmpHTAaHztH3oJI4brnH33Z/vbsD5QKGfH6ywVvsQ7CFWN6cf9kWqD/CrMdpTxUKexb8fGFVHLccrW2hNxY7vxhzyepRHZKKTGRQ1L1+vrvWRJ9gUjmixaxxiqUkhTuf7jeEDJUfN/NhnZE7J3OkGWRGqeXJY521kKrZr4WM= 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=WPwwt+Ir; arc=fail smtp.client-ip=40.93.194.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="WPwwt+Ir" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kPhu0zUOElA/d5/O3IDpS1fY6YryslUjpzYw+5eT9TnRKKd2rgls4lCGYy83DQ2uZPARKD5IeRbVXSWNGo7KjQaZE7Z78QMTf0cthufu3xdcRLl7JwEtrDeA34UPQvcIiXDl4JvFVgw+uL0kqELDpHh5fvBlBKEW98n+JugaS8JFASoF8qBunxC1duIluhUFy0eGchk+5Ce/RQdL+I6WR3e56C3LJTF/7FaG4hD+xqqEianpVCSULiHLYaOlCQpEFStRJSmXfe7z1MqivXdR8lmSfwV2zhwWv9dVPtT5feKoPV3R+jD992+XSNx9+e2DR9bu/ql6o2ba4Bo51oUnLw== 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=QEyhZsGiQZKzjjwO0RUuNmO4S2dtDuwkJgyzn6/BcSw=; b=gkJBNX/MhnGU5OvhwecNz0/7xnP+2Uc4bosIngRfGo3ze/eAKe5D0MPJ0EtMPI8BxvVJEOFsxksFVlSnAhBup0wWGw/+IKNUkaIJ14JZEgSagzHAtvfNO7M/C+wSATu3ZUrXB1bnDKu+Zga8vOCy7QEr2b70edBeI4S450geZ6CCAyb5yZwt/IEoV4Kosn3tcMPP1zbtXXACZ9bEbeBADji828mrUfyaPwlUE7M/XAoVyC3Gr9AcSdrg16hKW/ymh8iKi7FdFX28ku+HNFuUija9351vEJ0optN/2vt3n9ndbemr/8Qtzyujg8KCHXiI+Chn5yh77ixwdsknJdLU7A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=QEyhZsGiQZKzjjwO0RUuNmO4S2dtDuwkJgyzn6/BcSw=; b=WPwwt+IrwZ+pf6CSCzovFrPk6leESO+lDEBRR74BlCXxwB4rCwX3fcal7LwBt0rCx1XS4Vads4Von0hzHPNRQR5BEVxQYIiCpNttbVtCy4Vbsd+vU8xtu92/LP2GO/atjZVIV8Hn5LkK32NI974O9OaHgLS7uTBUNqc7e4ujDTfAWeEH0/48/oD/g7Hy+y/CA09gc6hm2G46WU9w4ypi+1sliXCqtdelCOjmfi7eONV8b9MsfW5qMpuNdQr+Qrs/+wBBIm30irmBDpn+00bZ4/6KCauR3PY8REo9rJag6NQ0BrMhSyVub59zfpo6gBDHsY3Jljk4cf1RT8H4xCJ2ZQ== Received: from BN9PR03CA0501.namprd03.prod.outlook.com (2603:10b6:408:130::26) by CHBPR12MB463627.namprd12.prod.outlook.com (2603:10b6:610:36c::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:50:16 +0000 Received: from BN2PEPF0000A892.namprd04.prod.outlook.com (2603:10b6:408:130:cafe::48) by BN9PR03CA0501.outlook.office365.com (2603:10b6:408:130::26) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:50:15 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF0000A892.mail.protection.outlook.com (10.167.248.184) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:50:15 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:50:02 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:02 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:49:54 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 05/32] gpu: nova-core: gsp: expose the VMMU segment size Date: Mon, 14 Sep 2026 10:48:40 +0300 Message-ID: <20260914074907.1399629-6-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000A892:EE_|CHBPR12MB463627:EE_ X-MS-Office365-Filtering-Correlation-Id: 14e7a302-245d-4c71-5444-08df1234d0c2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|82310400026|36860700016|7416014|376014|11063799006|56012099006|3023799007|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: haxqF1v8rD6N1S1O5vu7ZOcfBahFx1XZG+h9Vpddam1dnXX8gFqnUoPpexxux5wcvMRBUuSoag+pdwr5Os0C+tR/7GmnHoG3Osv3adOsvkW2b32hVWQRyxAXbpLW8jiKgqgks1mVYxK4uUvoN6LluzWi2OXN2JKQT69NRzHMnhrAqgXyj4jJQHdAmlDgqmoiPdbO7jtoZBlg8G4XV7UbtwBtgerbYbwGCrmL9rvoGLI0e5CmOvdkBlgMHa6LJyNpAweeb9ZepyGF/zcxJDTeeJ2G9LiS7rpcXZKz/egbjwOK99atfemhtzIV9zt+mgCHiA/i0axLczfQLLCvSm88uF2md1NDew5bGQzrMRsqZ6QHjoKPeOHuhB2cSfwIJDgfXyU9kwQmkS9doq/t6mdpjFQUCG4yHlYjjjex/xoXinEk+AR+ZAGAJd9zllUQtbun4ZWEvRp5FPmF9dg5ynvFZnZJdsmSLK0r0sfeuJHUMv8OoZ1w39r4xCoSBH3DC564jqAG0gRCQ4zUQeE0p+CR+h1aJRAnK6hv+hSAjbQCan8RA1d2su+hFbajY4h4cLH0ShZLNAbr0INODFrQKKarZn4hoPrqZeG7E68a5yskzB2zSGbYHPG05dlY5pEUNpqWmSa9hTa9kFgEG6CIybTp2MHthzyj2B6YVVGrDseusd+TRi+iY8Fg24MOT1du3PLOFPmAmMLAz4DYObw+W0pmOg== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(82310400026)(36860700016)(7416014)(376014)(11063799006)(56012099006)(3023799007)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 73qUNBBCp3mfioVchwSW9vHBTeGnQnH/AwpEq4HMkK1rIq1MHredzlf5atlsmVD7NuuF1sIgJGGq+OYoTiZ1YVn3Upwj1wbbD5kvHJvJ1wIxHG5yAcXNzpW+aVD28mZ1c03qs7pe/MxqzMJwuZwWwHDnS14ShRCRmJQURUs7fjJ4Ufc6tGuY/YPdsGrtDRW/+iCyt+x1GI6m9V3Pun4kTg5sfjcvRW3A7+B3ICYr4YJkCVMGSUmKyZ3ZmoQw4aDXSj7DnFOLXK+/oK3eBIN18RvZlM6gLq9TC4QSnM8i2rNW3CFp0pZSSW0REbmfCgbA7UCrlYYbphYATv2FDsu/DEslwmU1/v3r8YsTKQLES5bvSyGRzyp2jT8sNcC+/K01hSn/Gq59HWqvLqFDsOfPWTSHxjvjG8Gm/IXGWTusnERhx2fSPF36IkcH56x9qsr0 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:50:15.8133 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 14e7a302-245d-4c71-5444-08df1234d0c2 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000A892.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CHBPR12MB463627 Content-Type: text/plain; charset="utf-8" GSP_INIT reports the VMMU segment size needed to align vGPU guest memory allocations. Add a getter for the existing decoded value and propagate it into GetGspStaticInfoReply. Keep zero when firmware omits the optional key. Cc: Alexandre Courbot Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp/commands.rs | 4 ++++ drivers/gpu/nova-core/gsp/fw/commands.rs | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index 09223bc3b793..afc32c2a230e 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -53,6 +53,9 @@ pub(crate) struct GetGspStaticInfoReply { pub(crate) usable_fb_regions: KVec>, /// Exclusive end of the FB physical address space. pub(crate) total_fb_end: u64, + /// VMMU segment size in bytes, or zero if GSP-RM omitted it. + #[expect(dead_code)] + pub(crate) vmmu_segment_size: u64, } =20 /// Error type for [`GetGspStaticInfoReply::gpu_name`]. @@ -276,6 +279,7 @@ fn decode_gsp_info(words: &[u64]) -> Result { bar1_pde_base: decoded.bar1_pde_base(), usable_fb_regions, total_fb_end: decoded.total_fb_end().ok_or(EINVAL)?, + vmmu_segment_size: decoded.vmmu_segment_size(), }) } =20 diff --git a/drivers/gpu/nova-core/gsp/fw/commands.rs b/drivers/gpu/nova-co= re/gsp/fw/commands.rs index 2b9f8edb039d..c2e199688b79 100644 --- a/drivers/gpu/nova-core/gsp/fw/commands.rs +++ b/drivers/gpu/nova-core/gsp/fw/commands.rs @@ -367,6 +367,11 @@ pub(crate) fn total_fb_end(&self) -> Option { .max()? .checked_add(1) } + + /// Returns the VMMU segment size in bytes, or zero if GSP-RM omitted = it. + pub(in crate::gsp) const fn vmmu_segment_size(&self) -> u64 { + self.vmmu_segment_size + } } =20 nvkv_decode! { From nobody Fri Sep 25 10:37:46 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012028.outbound.protection.outlook.com [40.107.200.28]) (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 025493D411A for ; Mon, 14 Sep 2026 07:50:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.28 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372234; cv=fail; b=EAf6WM3Q1GTsq5RIqe3xY8AhtPGgjkcskR4AzruMfiPahvFL1mNJ3u48pBudCX8CSnxdt8HMsanVBMoU4dnKW9JL1ek0zHQaFqY/aRX72Y5fdt4VCu/r9ueqC1hTn7cKtokvgqGfEOJtf4IitzFv7WZYU4OcU0g5KHgkd9LRwBU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372234; c=relaxed/simple; bh=BJrJHkHJAYVEfw02NqJMi903f1f5eexrYSI6vYNbN/s=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aV+nty9KF7/ZFFO7qznY25giScb9xnEvO9K9DWycmI/D+6TaZIpX/Hx3c5VduBLvZNjSw0nRpj6Q0RCTvOc8tFNcFsWlc93k/+iZcfmDARTz2zj0RRetQMYNd5whJsGRVujhhp+vn0Of633/CBWV/l+0nfPlbm/aq+D+qk2mZzw= 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=uRoj3UMV; arc=fail smtp.client-ip=40.107.200.28 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="uRoj3UMV" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=zUUM6ndqXa8y6Vf2mLqUjVD+1i079rSDyA0w/3T9y5rfmtQtkTLvk+CeEEJ6a8zB8K1oKwV4myqPanMrsP7WI2MGiahKCEFf372cBjJ1eZA2DZdUhVefDg7zson9JmN/wt1bzBeV9Tsfb2XJzEE9TXTDrFYpWev2wBM6b4tAJA4K8DnoGdDGhcsrey/gLIRYIFBKk4gr9YVHG9U1gEJT1TLlF/sNsSIXoyezSsLmeklqfK8UgiLH/dnvest2XzerPv2LsE2cbxxM0yhpV9NXITKuy3illz7/tEU3zJZJSiOPFvVpfQRJZKmyOTKvgWrBnTQQ7FfvJsdXD429lwTEbw== 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=2WaFj0TxJNJ3Vuyud6jZ7PGFReSsg8mXIrKoh74IJRs=; b=rVwvO28ge8YXHAxYyvzUth4V3j4QK1/MzR+Q9m3Djk/BznGLVVlNf3agcQsxwuyx4jGL2Ho2aT41SH8F6buduvccfpKrPZ69sTHVHebvT0yzRshOAjD44g6zRfP3gdCYnZuYl/qdsdflwWb916vUozfgPwljrhEbx1lPNbj2NxcByeS3dkVyqfEuGjFfJMoN+UwLGi0sCftksKHOc2T9bY9xeYbwnvsSIPcmt+liwNjbpS5jcNkQE27ntapKg9fQVn+8z1O/9ZLQdUbPf/zsEFMZDSllQSb/Pt1NWR6g7XZ466i86dffCiCnQdcfO76ZQaTYIUKrgFAvLFnlAVysng== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=2WaFj0TxJNJ3Vuyud6jZ7PGFReSsg8mXIrKoh74IJRs=; b=uRoj3UMV3EybtT33c0WDL+51m/uo/lRsmm82nKmJ5PXojCFMxmrIM2DS7CCnKgyxCmIJjqhaQzvHtQ31LsnOeIAX+2/TKk0jvR0JngAQoVy8CmGf4p+mpO246jc8QoTTDIQUeOMT2IZSONB22SnD/5Vnt1eb1Q/Aq1lTJ2taYk9GXpKOF1xEBFPv1Prt+D7ZhUsnjW7VT/iH6gp+75oQ5j9dROZK+8jsskVTTM902Nu7zayCznKqmTRi8Pu6xfgM8jbilOV0GHnjzJ3IeRwcSC5ZzeC4qI7M/njCJ7Zhz6hm6KEgjxRFEbpXlcT60tU7biwZC/WoyBnFH2ck0aF1AA== Received: from MN2PR22CA0012.namprd22.prod.outlook.com (2603:10b6:208:238::17) by IA1PR12MB6650.namprd12.prod.outlook.com (2603:10b6:208:3a1::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:50:26 +0000 Received: from BN2PEPF0000A88E.namprd04.prod.outlook.com (2603:10b6:208:238:cafe::3c) by MN2PR22CA0012.outlook.office365.com (2603:10b6:208:238::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:50:26 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF0000A88E.mail.protection.outlook.com (10.167.248.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:50:26 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:50:10 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:10 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:50:02 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 06/32] gpu: nova-core: gsp: decode the FIFO engine table Date: Mon, 14 Sep 2026 10:48:41 +0300 Message-ID: <20260914074907.1399629-7-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000A88E:EE_|IA1PR12MB6650:EE_ X-MS-Office365-Filtering-Correlation-Id: 8bc6aa0b-3912-49ce-6419-08df1234d710 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|23010399003|82310400026|36860700016|1800799024|6133799003|10067099003|11063799006|56012099006|18002099003|22082099003|3023799007; X-Microsoft-Antispam-Message-Info: TuslLbuZzM5vqAsqCxaK9ChYWHEdyd8h2SsSb5c470JUIgVi0TzQpo25Qgn/eRm36xvB7vAooUu5FYA+7MoYQmCUrM/WragFyf7iWk+Xxp+hyrYwD58Nk/09qU8QUZJWZJXWSu17KE/U145lrKoweLaU9Tf1C2RF8gTwaDgpiaQvEYLBP53UXdGireITUVGvPYh6ky6bzqYSJMKUBBsEFwEB/CHascctKT1/fzqBx2bf6iSUk8/LWh5PuHBNKytjAkTtnIL3Y7qCERwKkG0dUHinQFlManYKz5prvcrmLKbNLWPJ8h6pnQTEIsxyxaFqKgKqV1or993SRilVMYaKlGwpoQloQNIwdFkTtDdb8vQ0ZjCasW2a+6JfRCLbdTDVsUepf1o4ZbMUBSx6QSNlDO/4mphLtkfNWGvF83ZOv6r24lyjwDdwd8OG2JE/rGrzvLOgBFw4wWBOmo3wZYEp3o+Ix6DXnleB4TsqQ/YlCzvY5pCDJJOfLtB71Z5Mx1DbbO2zWiDFhL9ZmJzef7vOyqo4Eds5Ti7AIDmVYVyQIGjlzdhReUY8+n0mSL1wQFvM7+vbslIBA/JjDGSkCNh6YNXnNnJiTkk91Q0lKHHeyQDy7e5z0gFg8eWtpXW8EbjIPxpWFiY+1h0dXe4dchO6AnuKT8VPAN4KMLey/B+gpPuE0pTPL8akdfIGQrGazNlD5Rs+WjTc7LiAQfYM7qx7Jw== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(376014)(7416014)(23010399003)(82310400026)(36860700016)(1800799024)(6133799003)(10067099003)(11063799006)(56012099006)(18002099003)(22082099003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: nHX863ipi6MD4caI4c4DK1Xrax03f1msU+iP7lJxSTdkFZyZHOhjlC7DVo5M9J5+s3Fw+AgM8qANvA2ZYwKL9xMLP4HF2MM8c0A7rgeBEf2JSNUEtiu05i2BGvxyQGoNJSP6uRDkapc36wRwfqvcPgM0DtO2uoKkGbzaWfCIZIDNj4O+i66JZD6zTXqIFh8bbm7J9Tv3+hCFIVlbFIkk7qVAk38XEb1y6mt/WEWAnzKuPLx9ZX4KnGxwv5+NZDpdkQTiTktL4QtPn5e9y3qxUwGMA/oNXlqGEtnD4KdUKzrQm93T+rFQ3dciCWWzmRoZvqekPevoKIDpOcllgQVqjGqNvLiWtahugr3VwkIrVEkdI0ss1Trf8RN5VGRmJuvNPKtDjy7uIWXcQRnmLYpMjpEEQL3zS8IVOAW2URlcYaweuPG27lzebtZZuxgLibyP X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:50:26.3905 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8bc6aa0b-3912-49ce-6419-08df1234d710 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000A88E.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR12MB6650 Content-Type: text/plain; charset="utf-8" From: Alok Kumar GSP_INIT reports the FIFO engine table needed to build the engine bitmap used during vGPU instance creation. Decode the engine count, GMC IDs and flags, and expose host-driven engines in GetGspStaticInfoReply. Preserve firmware FIFO order and duplicate IDs while filtering on the host-driven flag. Cc: Alexandre Courbot Signed-off-by: Alok Kumar Co-developed-by: Zhi Wang Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp/commands.rs | 47 +++++++++++++++++++++++- drivers/gpu/nova-core/gsp/fw/commands.rs | 34 ++++++++++++++++- 2 files changed, 79 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index afc32c2a230e..3820320dcb34 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -26,7 +26,8 @@ GspInitResponse, GspInitResponseSchema, RegKey, - VfInfo, // + VfInfo, + MAX_FIFO_ENGINES, // }, GMCAPI_CMD_GSP_INIT, GMCAPI_CMD_GSP_SUSPEND, // @@ -44,6 +45,28 @@ vgpu::VgpuState, // }; =20 +/// Bit mask for `NVGMC_SC_ENGINE_FLAGS_IS_HOST_DRIVEN`. +const ENGINE_FLAGS_IS_HOST_DRIVEN: u32 =3D 1 << 0; + +/// Host-driven GMC engine IDs in hardware FIFO order, including any repea= ted IDs. +/// +/// # Invariants +/// +/// `count` is at most [`MAX_FIFO_ENGINES`]. The first `count` slots are t= he retained engine IDs. +#[derive(Copy, Clone)] +pub(crate) struct FifoEngineList { + gmc_ids: [u32; MAX_FIFO_ENGINES], + count: usize, +} + +impl FifoEngineList { + #[expect(dead_code)] + pub(crate) fn gmc_ids(&self) -> &[u32] { + // PANIC: The type invariant bounds `count` by the array capacity. + &self.gmc_ids[..self.count] + } +} + /// The static GPU configuration, as decoded from the `GSP_INIT` reply. pub(crate) struct GetGspStaticInfoReply { gpu_name: [u8; 64], @@ -56,6 +79,8 @@ pub(crate) struct GetGspStaticInfoReply { /// VMMU segment size in bytes, or zero if GSP-RM omitted it. #[expect(dead_code)] pub(crate) vmmu_segment_size: u64, + #[expect(dead_code)] + pub(crate) fifo_engine_list: FifoEngineList, } =20 /// Error type for [`GetGspStaticInfoReply::gpu_name`]. @@ -274,12 +299,32 @@ fn decode_gsp_info(words: &[u64]) -> Result { usable_fb_regions.push(region, GFP_KERNEL)?; } =20 + // INVARIANT: The list starts empty and appends at most one ID per sup= ported input slot. + let mut fifo_engine_list =3D FifoEngineList { + gmc_ids: [0; MAX_FIFO_ENGINES], + count: 0, + }; + for (&gmc_id, &flags) in decoded + .fifo_engine_gmc_ids() + .iter() + .zip(decoded.fifo_engine_flags()) + .take(decoded.fifo_engine_count()) + { + if flags & ENGINE_FLAGS_IS_HOST_DRIVEN !=3D 0 { + // PANIC: At most one slot is filled per input, and the input = has at most + // MAX_FIFO_ENGINES entries, so the next retained ID always fi= ts. + fifo_engine_list.gmc_ids[fifo_engine_list.count] =3D gmc_id; + fifo_engine_list.count +=3D 1; + } + } + Ok(GetGspStaticInfoReply { gpu_name, bar1_pde_base: decoded.bar1_pde_base(), usable_fb_regions, total_fb_end: decoded.total_fb_end().ok_or(EINVAL)?, vmmu_segment_size: decoded.vmmu_segment_size(), + fifo_engine_list, }) } =20 diff --git a/drivers/gpu/nova-core/gsp/fw/commands.rs b/drivers/gpu/nova-co= re/gsp/fw/commands.rs index c2e199688b79..706ecfa63c01 100644 --- a/drivers/gpu/nova-core/gsp/fw/commands.rs +++ b/drivers/gpu/nova-core/gsp/fw/commands.rs @@ -12,7 +12,10 @@ transmute::AsBytes, // }; =20 -use crate::gpu::Chipset; +use crate::{ + gpu::Chipset, + num, // +}; =20 use crate::gsp::nvkv::{ nvkv_decode, @@ -22,6 +25,7 @@ DecoderValue, Encodable, Encoder, + Indexed, Key, KeyId, Required, // @@ -286,6 +290,8 @@ pub(crate) fn new( =20 // Decode: =20 +pub(in crate::gsp) const MAX_FIFO_ENGINES: usize =3D 64; + // Should decode with UnknownKeyPolicy::Ignore. nvkv_decode! { /// Schema for the `GSP_INIT` response. @@ -298,6 +304,9 @@ pub(crate) struct GspInitResponseSchema =3D> GspInitRes= ponse { fb_regions: Accumulated, bar1_pde_base: Required, vmmu_segment_size: Key, + fifo_engine_count: Key, + fifo_engine_gmc_ids: Indexed, + fifo_engine_flags: Indexed, } } =20 @@ -306,6 +315,9 @@ impl GspInitResponseSchema { const GPU_NAME_STRING_KEY: KeyId =3D 0x2000; const BAR1_PDE_BASE_KEY: KeyId =3D 0x1020; const VMMU_SEGMENT_SIZE_KEY: KeyId =3D 0x1050; + const FIFO_ENGINE_COUNT_KEY: KeyId =3D 0x0500; + const FIFO_ENGINE_GMC_ID_KEY: KeyId =3D 0x0501; + const FIFO_ENGINE_FLAGS_KEY: KeyId =3D 0x0502; } =20 /// Payload of the `GSP_INIT` response. @@ -315,6 +327,9 @@ pub(crate) struct GspInitResponse { fb_regions: KVVec, bar1_pde_base: u64, vmmu_segment_size: u64, + fifo_engine_count: u32, + fifo_engine_gmc_ids: [u32; MAX_FIFO_ENGINES], + fifo_engine_flags: [u32; MAX_FIFO_ENGINES], } =20 impl GspInitResponse { @@ -372,6 +387,23 @@ pub(crate) fn total_fb_end(&self) -> Option { pub(in crate::gsp) const fn vmmu_segment_size(&self) -> u64 { self.vmmu_segment_size } + + /// Returns the FIFO engine count, limited to the supported table capa= city. + /// + /// An omitted count is zero. Indexed entries outside the capacity are= rejected during decode. + pub(in crate::gsp) fn fifo_engine_count(&self) -> usize { + num::u32_as_usize(self.fifo_engine_count).min(MAX_FIFO_ENGINES) + } + + /// Returns GMC engine IDs by hardware FIFO order; omitted slots conta= in zero. + pub(in crate::gsp) fn fifo_engine_gmc_ids(&self) -> &[u32; MAX_FIFO_EN= GINES] { + &self.fifo_engine_gmc_ids + } + + /// Returns per-engine flags by hardware FIFO order; omitted slots con= tain zero. + pub(in crate::gsp) fn fifo_engine_flags(&self) -> &[u32; MAX_FIFO_ENGI= NES] { + &self.fifo_engine_flags + } } =20 nvkv_decode! { From nobody Fri Sep 25 10:37:46 2026 Received: from BL0PR03CU003.outbound.protection.outlook.com (mail-eastusazon11012051.outbound.protection.outlook.com [52.101.53.51]) (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 19F6C3EE1F8 for ; Mon, 14 Sep 2026 07:50:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.53.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372241; cv=fail; b=aSX4FsVzLIqivuWRKjAKPR4fT99CepakkWzLXwRqaRucUxUa8RrzEjwI5727MgCctqAmOUVlBRpALCmxLYaVvPscQ9CYkFncwK1/89bCa7pRYi0jP32Jo3kUqlcnZeldyCM5LGgy4v4NYQEwUit3ewSOZDr4KVCRTNvOvispx6s= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372241; c=relaxed/simple; bh=oxPLRXvRXJ3MdVkkgAPNBDY0hVMgDjtWUSwCglZxoyE=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=L/WTcdTuhB1FXzm28inD+0Mu2s+KsL8UBIxkNKQCcFPWea4gv2JSJp13bemh8/LACw2hl074bw8CbjrZUVIAgmCWMeHSQSQcqQkG34c9EhSS4ZS1PzV4+SxcMYkkeRD5ayqR3pF6KfJO0q+xnrLbycWD6/5PE9rKFb2WpePPEdU= 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=JieFknNl; arc=fail smtp.client-ip=52.101.53.51 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="JieFknNl" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ms4keGkjq3zqSKPP9O5At6LIwKgElwPKmjnaV+wgRH3oNbzlMlO5vdrj5t5IMsVDDFBr4nTD/oCBImASoyszounP7H+1cP+N98CnU3EtJYnRTIbcRwksyJY2PGxHh5pP8rLyoch6quwS3E7SXu2QcNLPLnps6752EyzeKX6JD/ZJAWMyujvPwEAkN8mcuwkF+NCt4c3DV54xAEYDKar0J5rP83r+yVr4rWaVkmdvTXSmQup4qVfJfs3hW84l9/eZmp/kLxbcd9Bevxwf4Ot0eTYBhmpIhTMsApmIdBVhA7uXNFrvuBSf7tRnxd8gf+1aAOp1hpQ9yzSsUm6u3BaflQ== 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=uCr8SEjrGel8Y7+Q1TytAvR9130OejryzA3Ey+rmcjY=; b=gT4J6AIO3sJiEmxvZAgndCal0E2s7GiS7R4uw/f+6Rxd3PZWsUf0cjgLEWzeV0Da2kW7BfrAS4uElskvnrh32D6xwNbntJiRj4e8Hwj2ZETn+rPF72vKsQkKswCLhLJcAJwRege+mBTRdbQd0d6sqrTniBojkrWv25Q4PPv1bDJ5HCzQGm5q1W3Zwa1WX/VDUXRFMn4ItlqwxOB3f7xVbJ8Y75BulVogN5ql7VeG3UIXZ+MvQOCkNQIAkrBlRDPgozi9pDRzH+gugPXITiRsviu/tqLGMEVbloph4tBsJw1vvJzZpOh8CX8B/v5nIoNa/wfSFM/WjegKtio7k5EfKA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=uCr8SEjrGel8Y7+Q1TytAvR9130OejryzA3Ey+rmcjY=; b=JieFknNlLtKhs6iujf8BHO0RHLLJEtmt/+khGyc25+saz7dLl/KZQ3VHe2YWh5zN1YT4+8HAqSLmhB/RZCsRP+/icVr0ScB/QUxI+teiBlgG0IpGOc+jBn59xE2yNlGRK3kRcYfGYd+f+6dIbpAm7aQMr0IoLe28mF8n+YyDJ3IlTcyP4WJ8aOj7Q/aiJI4THPyU3I2En8HIids/1IO7CAcNz7xE7QeixpYY2jDc2m/d4gZ2FNLMGquKbvk7t/zvtYTQh/P8EuLxqH++UtCPH9Tv2Qa418Meu2JZKXx8e3d8PoMTsEoEYZTjC4DJvmjrOE5Q8j0yOEAPFyroVczFvg== Received: from BN1PR12CA0011.namprd12.prod.outlook.com (2603:10b6:408:e1::16) by DM4PR12MB6040.namprd12.prod.outlook.com (2603:10b6:8:af::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.10; Mon, 14 Sep 2026 07:50:34 +0000 Received: from BN2PEPF0000A890.namprd04.prod.outlook.com (2603:10b6:408:e1:cafe::22) by BN1PR12CA0011.outlook.office365.com (2603:10b6:408:e1::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:50:34 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF0000A890.mail.protection.outlook.com (10.167.248.182) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:50:33 +0000 Received: from rnnvmail203.nvidia.com (10.129.68.9) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:50:18 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail203.nvidia.com (10.129.68.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:18 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:50:10 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 07/32] gpu: nova-core: vgpu: initialize runtime parameters after GSP boot Date: Mon, 14 Sep 2026 10:48:42 +0300 Message-ID: <20260914074907.1399629-8-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000A890:EE_|DM4PR12MB6040:EE_ X-MS-Office365-Filtering-Correlation-Id: ae390fee-8055-4f81-8ac9-08df1234db80 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|23010399003|376014|1800799024|36860700016|82310400026|7136999003|11063799006|56012099006|6133799003|22082099003|18002099003|11062099010|3023799007|10067099003; X-Microsoft-Antispam-Message-Info: baaeg8Befe1Rs8oHAqoszypLAMNALK3VUOC6rwQR32V2rxafRjlKsvIsjY3eO96LT42sCKvBEHkwLE7uTODh48c5G05rdduH9qgsMzbmoA2E6btcUVs8uzr7SWxAFQW4Bfg7U/OENkJ6LPBN3PP+zegjPJ13YX++Qpi/SQ7jHti74VY1iTmK2JN1naqL8IMGfNNzChUfQbk2EcA71FEr3rN1g/H/jSN+xFj7eLPSE3DpcMneH5E2yzFTQAFTtXYhu4/1nwwmkZeFAcekIBH1BBe16jTRKHdS+gZrnSsQdGCBHABCjqq8whNQTOBuPpmioADgmv1Rh28Pin+R3967O5rxQ7cIglfKWzPLyv8FrfYCPoDMoXJ2mukC/pejQ0Gnn69e59c8ZOyYU4arzEY+qfvd5TXkyddOeZ+eKZqIy1hl+EEEpZ6HMbyQrBeye3GlDnYw/oCHp6w5+7M4kYsFgcY9/skflDbWuvhYzCpT6+B02K2YHGhfJ/ol3HUpsLNbWUmpj7JnY2pdLsUpuJYKUhni/COMIwoF8U6fhtPVOIPSUmRo+5CZNEFaOSpZR/caeP7BgaLo/t9lYcCYeJxmFPuhO6VS8coMN5OtVWSXRL5rPGW24Cs1PeAHEAXvz58yiy72OxraSeU4ISSVCd4YlwYCH+YvznawBs3CfT0cW4KN6b6wVVfvpJFBxamY1Bm3wla8cAEoWUs366VGRVKX1w== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(7416014)(23010399003)(376014)(1800799024)(36860700016)(82310400026)(7136999003)(11063799006)(56012099006)(6133799003)(22082099003)(18002099003)(11062099010)(3023799007)(10067099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Cd7VdvDvHtZ5V9r8m74isFA9C0ZZoP696kv5coSYWqWakuSWCPMuZOnL54ADtECPnGwf1Uq7yEPxoK1C/RpetJiF4usJG5H/a0oUoprrFuco7L00xS1fx/CqSfmWPBtHOC9QQFE7aZAPcWLLsjw1R7m6BVr8UzMRoiXv8mfyfUMMNaiofW+aaEUabgDq2UwEMb6lygT8CI7LI+wINOLwnBcGURFFrMqlyHNS0OcUPgUROWVf5iPvQwVh0jo3ADT+r7lXZVWBZ1BpIMv0RX80kh234Ca9yEVgHsZbfKr/n3xk3Sj7mXX7xWykR0O/VlF1ns7xA+HyOUxJTBFrqQXhyBLNLOCho3Ky9Eb6quXAWQAfLddTnR5jJY4ki3eguN0JLJj7NYfbyk3hscrhH3b6btnfBt4h/du+b8h5yAmizoRSNJB+ztpJN9ypOIugKIgE X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:50:33.8351 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ae390fee-8055-4f81-8ac9-08df1234db80 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000A890.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB6040 Content-Type: text/plain; charset="utf-8" GSP_INIT reports the VMMU segment size and FIFO engine topology needed to divide resources among vGPU instances. These resources are only meaningful after a successful vGPU-enabled boot. A disabled GPU should not construct a manager, and a constructed manager should always have its complete runtime parameters. Have Gpu construct an optional VgpuManager from BootResult::static_info after GSP boot. Copy the ordered engine list and VMMU segment size, use the pool's 2048-channel capacity, and store them directly in the manager. Expose read-only accessors tied to the manager, preserving a reported VMMU size of zero. Cc: Alexandre Courbot Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gpu.rs | 23 ++++++++++++- drivers/gpu/nova-core/gsp/commands.rs | 2 -- drivers/gpu/nova-core/vgpu.rs | 48 ++++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 733a2c09ec01..227531b28541 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -49,7 +49,10 @@ VramAddress, // }, num, - vgpu::VgpuState, // + vgpu::{ + VgpuManager, + VgpuState, // + }, }; =20 #[cfg_attr(not(CONFIG_KUNIT =3D "y"), expect(dead_code))] @@ -311,6 +314,7 @@ struct GspResources<'gpu> { #[pin_data] pub(crate) struct Gpu<'gpu> { spec: Spec, + vgpu: Option>, /// GSP event interrupt registration. /// /// Declared before `gsp_resources` so it is dropped first: `free_irq`= runs, waiting out any @@ -436,6 +440,23 @@ pub(crate) fn new<'a>( })?, }), =20 + vgpu: { + let info =3D &gsp_resources.boot_result.static_info; + match gsp_resources.vgpu_state { + VgpuState::Disabled =3D> None, + VgpuState::Enabled { .. } =3D> Some(VgpuManager::new( + // SAFETY: `chid_pool` is initialized above at its= final pinned address. + // The private manager and its pool borrow cannot = escape this `Gpu`. + // Completed field drop order drops the manager be= fore the pool; on failure, + // pin-init drops it before the earlier-initialize= d pool. + unsafe { &*core::ptr::from_ref(chid_pool.as_ref().= get_ref()) }, + &info.fifo_engine_list, + info.vmmu_segment_size, + TOTAL_CHANNELS, + )), + } + }, + // GSP boot left the SWGEN0 latch set and pending bits in the = tree. _: { irq::gsp::quiesce(bar, gsp_resources.spec.chipset, vectors= _ref)?; diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index 3820320dcb34..c2faa825a849 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -77,9 +77,7 @@ pub(crate) struct GetGspStaticInfoReply { /// Exclusive end of the FB physical address space. pub(crate) total_fb_end: u64, /// VMMU segment size in bytes, or zero if GSP-RM omitted it. - #[expect(dead_code)] pub(crate) vmmu_segment_size: u64, - #[expect(dead_code)] pub(crate) fifo_engine_list: FifoEngineList, } =20 diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs index b405ba49c490..348af9ea3fc2 100644 --- a/drivers/gpu/nova-core/vgpu.rs +++ b/drivers/gpu/nova-core/vgpu.rs @@ -13,7 +13,11 @@ Fsp, VgpuMode, // }, - gpu::Chipset, // + gpu::{ + ChannelIdPool, + Chipset, // + }, + gsp::commands::FifoEngineList, // }; =20 mod hal; @@ -80,3 +84,45 @@ fn query_state( } } } + +/// Runtime resources for an enabled vGPU boot. +pub(crate) struct VgpuManager<'gpu> { + #[expect(dead_code)] + chid_pool: &'gpu ChannelIdPool, + vmmu_segment_size: u64, + total_channels: u32, + fifo_engine_list: FifoEngineList, +} + +impl<'gpu> VgpuManager<'gpu> { + /// Retains runtime parameters from a completed vGPU-enabled GSP boot. + pub(crate) fn new( + chid_pool: &'gpu ChannelIdPool, + fifo_engine_list: &FifoEngineList, + vmmu_segment_size: u64, + total_channels: u32, + ) -> Self { + Self { + chid_pool, + vmmu_segment_size, + total_channels, + fifo_engine_list: *fifo_engine_list, + } + } + + /// Returns the VMMU segment size in bytes, or zero if GSP-RM omitted = it. + #[expect(dead_code)] + const fn vmmu_segment_size(&self) -> u64 { + self.vmmu_segment_size + } + + #[expect(dead_code)] + const fn total_channels(&self) -> u32 { + self.total_channels + } + + #[expect(dead_code)] + fn fifo_engine_list(&self) -> &FifoEngineList { + &self.fifo_engine_list + } +} From nobody Fri Sep 25 10:37:46 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010043.outbound.protection.outlook.com [40.93.198.43]) (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 42CB13AFB1C for ; Mon, 14 Sep 2026 07:50:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.43 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372252; cv=fail; b=UKlxsyOG9tCRtb9h2NxZbJwXSmtt6bqtdiFIACojmmToB7mcNX2j9YtXS//LVismYL691m5xXoY2LLCQecuZ3kQ2cwDm8r1plwXxa4lgj7Qe7QzuCnQ3oNvnTQ3HOWJcm1B1TIk4CadsQy3EV41wc6SpQKaCn7KVVgOT/XMir2Q= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372252; c=relaxed/simple; bh=4XLk+N/zsiIteLPIszblBhSORJJtRLNWgbuT7OPKUQI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CKowxMbTCSzKRaf1zCN5DopmT6L/ZlIFjslf6X7UNMbTpa5zWU/xIeo1cbLm8/IK/tqqIeraTE/n+Z+yM7NDEHU/MH8nJ5sTXzNgSdirDW8SHp5ReBpD2D61F1JPx7JbZ+3hLR715SuHwpKV9Ocq21GTdBB40zP+FsfYEzy5nq8= 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=UfyKHQJX; arc=fail smtp.client-ip=40.93.198.43 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="UfyKHQJX" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZjDuB5/Fz5GxHfFkAVTarmy72ys0J8nd2pYDuMV+yI/8fQmMlm/MdSOcKjcFHI15NONSasIID8kcLnl7sotD2m4R1cPa6LxiEWBnWAoly5kmU3pSERWHPD1W4w+Yc4TuV3W1FieOUUh9tQo3NHfRmkfnnz3efUGukRPMgIvYjfkPOCY7hge/hXlnSBeul81pBGt4OGamwd3YTD5s2rJUzmMcOqRcCFt2ZTzCULmEKxIFK7WL+vL3qQj3iR1pYkevOv9ayQHvZO6o48cYkLPzNbaiADLdHkzsEGo4lt5oW9fkg6c4Ynop1Bg5XkRH9oWwGnZpOEoveA1qdC5JxTyE3Q== 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=2sR5DfVOlU8Ib/I7w2xfmirMsgTD7B4vL/zoEebFIyg=; b=oRZFlC1Luk08sjbiKvZeB6pGLp1kcnn6asZVJ2iWGID6YuvLfmGtJnbLLfVXI9DHG/j/wru2OWgK2xElDtlAf6XyHn1b7zkEnCL8BrvLgAjv/saMYIg2M+imin0Mhd5LnCcVHtXg3pzHSu4FyC3M6iwfmCmBwA/5NLeyhCpyusqgZLF+07ylh+8fie3siy4cu9CgQ3htKfbJD/jIeD9NQRHLC6R2EaZRO1Kc9+iiHrRlP+EIC/1AYZEPuYME53SapdDyCW5wver6TaBSNN82XyZxj3wvC72LQ9N6IRYg5XAbu7hqhi5fAA4HoGfW+rma5GX1ztXSg2BPfolWGk1G6w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=2sR5DfVOlU8Ib/I7w2xfmirMsgTD7B4vL/zoEebFIyg=; b=UfyKHQJXgo37/bRVol3mQG1LVVFbrDc48QaRebyw3DwEvtflSE+X/wqjHXU6lv7Prp9OKhyhKc1vVvc3CbmZ36AVqwdY8gNxZTInTbG8nsdovfk3RLiH7/HVJAV0cyqS8932QL4FjU8mkgg6GHw7/Hqj3uCfu2UYmPw2AyZ23KcO7zsr2KTRdULEHmVvsEL2Y//1fJZRVeyuray43HhGY1RzlCBLln4jpBPvb66b54L27IaYUTDPLMs+litiwmhNA6VC340UAURWrt2RPa8RjCjCUh9G9JG/kDW3jLTkWCSwf8MmOLwLbGL5YP4+wJmvSc8vGQ2s2NHyiG8qDKpSfw== Received: from BN9PR03CA0563.namprd03.prod.outlook.com (2603:10b6:408:138::28) by CY8PR12MB8265.namprd12.prod.outlook.com (2603:10b6:930:72::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:50:43 +0000 Received: from BN1PEPF00018546.namprd05.prod.outlook.com (2603:10b6:408:138:cafe::87) by BN9PR03CA0563.outlook.office365.com (2603:10b6:408:138::28) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.360.13 via Frontend Transport; Mon, 14 Sep 2026 07:50:43 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018546.mail.protection.outlook.com (10.167.248.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:50:43 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:27 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:26 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:50:18 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 08/32] gpu: nova-core: vgpu: reserve the 48-VM WPR2 heap Date: Mon, 14 Sep 2026 10:48:43 +0300 Message-ID: <20260914074907.1399629-9-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018546:EE_|CY8PR12MB8265:EE_ X-MS-Office365-Filtering-Correlation-Id: ab734036-8ea1-43b7-4279-08df1234e12b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|23010399003|376014|1800799024|82310400026|7416014|56012099006|11063799006|10067099003|18002099003|22082099003|6133799003|3023799007; X-Microsoft-Antispam-Message-Info: GQjvdz9PvUyEFShBg2posUHRNsHYh5y2oyl8eaIHyOW6HjgTz7JmdW++pupWMkame+8lnNSI91hCWZvbTAJbBtYyfxp0f0HAypHuP4e+HbHW12bqlYqXBSxUdIPAPIcs+uaZdM/+pYhAimnbfG1srnwCPLN4PKM3INRnFXLt1S1K81UEuEtSKER5NNzrZkjnZ184C0kY0NbTeiT+AE8nWHlOEyw8NFBzNK07ubPEZPD5Zogr7qCVeV7uLStyWGHmJe9yO2Jkj/a8KVQdZElUCYsHzXacF8VjCawDyiQOxRQ19qcMbhJtV+scfQUfmTZiPpe+BwpqsA12D8uwql5Tfr3C5Gzr2NqvTBTZcZykX07E7pYfoHSPp80gSkNEkfh4kyKkKuDnFIjrq7IZ8kcFqVuNP/fh8WqTOOan5vRupnYSCm8CI2wI3uyZk2DctNgYfJkvHKezINvqnWWutDST8StC20hSJdOCLwwVEj9j3Gd+5PIA4l4niairEPM+YQm1NxaT8C15Fcz0IaJkqaSVxLsiK4VganCwVSN+7eBb0WlyufEiok0z9IuDwvMnxB7Qr/G+QzgkNuzs9lZbEmtIyVp/w2KInQL3wEgsbNoqdN9vktqnOcacriY5eqzu98CGB9bItrmM7j/379h4gVUrsnjMa0Sh4bR2BMZwGMslDtOqo9srebOSYJzpzpFR7oMScfSWDFBjUsAmqTbGZTveYw== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(36860700016)(23010399003)(376014)(1800799024)(82310400026)(7416014)(56012099006)(11063799006)(10067099003)(18002099003)(22082099003)(6133799003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: f6NOPrLLuQWQyLU7Ol11bvJakpqoOAyir35+58xXm687QFK4z2cP/gxJW1Z34kWUWgtwhHkAmVU9etdrptWv04upyjixqtQVnJu48sWoaq9lo0gKqq+tyYDSJAqJBeyPsA+1yBUE0p/cpKlzzAILi0Dgg1pMfowAIGexx+cK1AsIlak9iQ/qLkVZOqX9fzzy34aZZVO9onhaqCLfaga2OhBf3vAFcyPiiRSR9nhySzvTaBJxxa16REy6Ud1SApJHmYrrRLb8PIWUHxPs72TRWk0H8/GAweU/OWnhQ5601pXAqCvQ/LLtmqfKp6C+4r+s0vDVnUD71AgzH2BimSnRNpOy+JOIyVOzEWbNVm2cmtyo/g5+YGayeFQjA4McdzzZeimhGM6VkjY8skrBtqSEFAmNe+6FxWPz91vygMl5N4v5wa6VveeErOtX9U2XsKTy X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:50:43.3327 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ab734036-8ea1-43b7-4279-08df1234e12b X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018546.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB8265 Content-Type: text/plain; charset="utf-8" GSP-RM needs the larger r000 vGPU WPR2 heap on devices that advertise more than 32 VFs. The default heap is too small for the 48-VF GB202 configuration and GSP-RM fails to start. Select the firmware-defined 48-VM size from the detected VF count while retaining the default size for configurations with 2 through 32 VFs. Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/fb.rs | 2 +- drivers/gpu/nova-core/gsp/fw.rs | 7 +++++-- drivers/gpu/nova-core/gsp/fw/r000_00/bindings.rs | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/nova-core/fb.rs b/drivers/gpu/nova-core/fb.rs index 882827bcfd3a..ba68a812b095 100644 --- a/drivers/gpu/nova-core/fb.rs +++ b/drivers/gpu/nova-core/fb.rs @@ -302,7 +302,7 @@ fn wpr2_heap_params(ctx: &gsp::GspBootContext<'_, '_>, = fb_size: u64) -> Result<( ), VgpuState::Enabled { total_vfs } =3D> ( u8::try_from(total_vfs.get()).map_err(|_| EINVAL)?, - gsp::LibosParams::vgpu_wpr_heap_size(), + gsp::LibosParams::vgpu_wpr_heap_size(total_vfs.get()), ), }) } diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index 77a66f77f4b2..309f9296ebc8 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -129,8 +129,11 @@ pub(crate) fn from_chipset(chipset: Chipset) -> &'stat= ic LibosParams { } =20 /// Returns the WPR heap size to reserve when vGPU is enabled. - pub(crate) fn vgpu_wpr_heap_size() -> u64 { - u64::from(bindings::GSP_FW_HEAP_SIZE_VGPU_DEFAULT) + pub(crate) fn vgpu_wpr_heap_size(total_vfs: u16) -> u64 { + u64::from(match total_vfs { + 2..=3D32 =3D> bindings::GSP_FW_HEAP_SIZE_VGPU_DEFAULT, + _ =3D> r000_00::GSP_FW_HEAP_SIZE_VGPU_48VMS, + }) } =20 /// Returns the amount of memory (in bytes) to allocate for the WPR he= ap for a framebuffer size diff --git a/drivers/gpu/nova-core/gsp/fw/r000_00/bindings.rs b/drivers/gpu= /nova-core/gsp/fw/r000_00/bindings.rs index 454d0ea9360f..fa17d3e2edf6 100644 --- a/drivers/gpu/nova-core/gsp/fw/r000_00/bindings.rs +++ b/drivers/gpu/nova-core/gsp/fw/r000_00/bindings.rs @@ -84,6 +84,7 @@ impl ::core::cmp::Eq for __BindgenUnionField {} pub const GSP_FW_HEAP_PARAM_SIZE_PER_GB: u32 =3D 98304; pub const GSP_FW_HEAP_PARAM_CLIENT_ALLOC_SIZE: u32 =3D 100663296; pub const GSP_FW_HEAP_SIZE_VGPU_DEFAULT: u32 =3D 609222656; +pub const GSP_FW_HEAP_SIZE_VGPU_48VMS: u32 =3D 1436549120; pub const GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS2_MIN_MB: u32 =3D 64; pub const GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS2_MAX_MB: u32 =3D 256; pub const GSP_FW_HEAP_SIZE_OVERRIDE_LIBOS3_BAREMETAL_MIN_MB: u32 =3D 88; From nobody Fri Sep 25 10:37:46 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010016.outbound.protection.outlook.com [52.101.193.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 52A383B8949 for ; Mon, 14 Sep 2026 07:51:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372267; cv=fail; b=TrtZn7wpEF2mVjgWvT3nQmVQPw2AC8ycMx+AaisUpgHQ8HKNwwGcr+BcP36g+WNRPGatixeodQnMt2P48BqQJbJzPZATPFSYO5wjS2I5hNLKwaOnW8y/i7o4IM1qRqtd8r3X6I1J8qfuM2Db/z8Oax/dx6MwKiG2ajV8npGXGUI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372267; c=relaxed/simple; bh=bqC6cGxzgozquakKX8563BGFsUwod76h8O6m6zVUKYI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=e35PpS7+MDUZ0vLLcF1Gi/xTx+LO3nQTDhFAiaBVbGMQNL5QcOvikqokoiqrwDI/Ku/zUdp+jFY+d/wCoqltAs63903UPta6a66ko4qrGDX3vY6UW4r+GCcmRpHajuIAqmmvLYWOsAh4GbnI4cgtC11K/zxX7xjpwEA3wUIkhy0= 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=JaGb7x76; arc=fail smtp.client-ip=52.101.193.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="JaGb7x76" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=u5Vior34/D2hU/8AM7qyK3kwrRxjDzbStcMEdxK7fdPAzxToRagVD5KKQLYeKEnseJbIm+9GG49Dd8yeWBZzMWlONWQHhbOaqYim44dw2gwk0p5dZxMko9mwKWG0NNnLsWhHnB8yL2f2UtJQvDr0uM5LqkMVAkhHm/FJbHfWNB1qSaJ5sOu5cVkgFMtnRq579JhR91qZexoACLnCIzaLW4gGQeOnwiU4j96T0Gc8uaEgFzKJAAbV9DjDGlS2Rz9jnOBaBsfgOy+vCGM0S5ynRA0opq/Hcx6cgPyrdq7aB2vIuh5FFJJHTSfHnUg1s3CUEq/AvwtzCodRaV4Y4XRxig== 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=RKIFgrdhLIseUzDu9MwYpLHHcMsfAFCgnSs5hjJ4uUM=; b=inGM30XH6tesM8wVy03sb0eRmqprzsAnBhSAHk2SuP05yOTlKDtDuWn0KkUglRqjLUaqmeJIwj7k92o38L1jmjMCjxpMxK7J8ot2Bia+0tHGeoEIQ2GpSAj4oBMtRLyWMxLpHTEf7xPGYOx3/OoFtMITR+ectHbhEUSVOH+6Us9DQg4sgeK5dB+F3+fVIXJbTgwnxQskyiZUM5AhOhmzAeM9VgBB4XFncsghqNXYW+NsYLbCK1Re8tfwupTuox2Wj2RNvq5/lCXnO9Qxj5Uu9cqEDvSjpO9QwZ+gjVO3fpp3XrabrnbnFhm6T9mZ6c8+P1J5ovgaIWU9bZeGC+dcCw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=RKIFgrdhLIseUzDu9MwYpLHHcMsfAFCgnSs5hjJ4uUM=; b=JaGb7x76wt6cUkPtZX6cwKolz9idYjuq8z5VZoo7TpjX+m1/2XtefNmFmlqYcyfKbSoeh3cbLMvhabsVc2KgD6rRT4Dt4LcBvyD/Mx+KOdJgtoyzLDB1XOWlIA3PjezhAmcmlBePSBzeeyIaoCzCSR6ueuf1nk/7ifsqwD4QlTn9SmY5fdSqkMAWIK7ZIDHmW8F9sosgHLVMWeBmZ1U7Q9wo3b1jHQlfbgq8DEf39D+C4/VftAWESc6T+eTX/KGc0WdA9M1Bybg6J/r3IOwmNE32U2gWhhIILxlKin9v6Ca2r2YbA1oexejx2w1u9HqbIeKOk5leqAyBAWNowM2i7g== Received: from BL1PR13CA0149.namprd13.prod.outlook.com (2603:10b6:208:2bb::34) by SJ0PR12MB6784.namprd12.prod.outlook.com (2603:10b6:a03:44f::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.10; Mon, 14 Sep 2026 07:50:56 +0000 Received: from BN1PEPF00018547.namprd05.prod.outlook.com (2603:10b6:208:2bb:cafe::94) by BL1PR13CA0149.outlook.office365.com (2603:10b6:208:2bb::34) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.428.8 via Frontend Transport; Mon, 14 Sep 2026 07:50:56 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018547.mail.protection.outlook.com (10.167.248.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:50:56 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:35 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:34 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:50:27 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang , Alistair Popple Subject: [PATCH v2 09/32] gpu: nova-core: mm: borrow BarUser for temporary BAR1 access Date: Mon, 14 Sep 2026 10:48:44 +0300 Message-ID: <20260914074907.1399629-10-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018547:EE_|SJ0PR12MB6784:EE_ X-MS-Office365-Filtering-Correlation-Id: 67756681-2525-4c48-0455-08df1234e8ba X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|376014|7416014|36860700016|23010399003|6133799003|18002099003|22082099003|11063799006|10067099003|56012099006; X-Microsoft-Antispam-Message-Info: WlhoqYg4SdtulgOKuG8Oe2yQFsEg1Nmu8PJDE68qCjyGMqvw9YdnpOvQ6Rn2bo3OwspB4QIjrU6OPAJPG65JaROvNxuQy08x/pBTgQ9rp+ySrBTN/g40oa0AbqbIu6+9uRU+7iqQ24jBbqrjGdcPL+CdrNJiO4CYf9XfMR/9NdJmykJ2044gzPDywmZ62BfI9K+j9LNjKAVcuGrWaugI7VJ8X5yxov8enud13kUm2pr2mySB7T/Pq1hXRuiYsW034PDHc7qIdXaeuzH/S1QY+dGW08xRuxRCvcM4Vg88AhGcZ1DYvZ9CEOly4Z8DoHjpiNCiag8/zrdxqUNwXaOl/jUlWCRsEzEnVQ8SIJPjfYupnXtBT714TPmkChyKuAUed9E7oYD+UUSYDukEMQgoIaM9ebBz+QH9bT9qdi03tA5Iy2m/VtRQQzBcqodisB+m3uZn1P/zV3fMk1eOZbpV8Sxwjxwr6+Jx7dHlO8en1WhWsLhyWQufK4Zf1glkRlVyQ0JmC7zTU+BCdcPdevQ0MkxgIm2YhpYQ0xwOn4Golvx9VarRmBmFzTEE0rcjQ216vTUSFQ1BWrIf5mOMbUjnbQkrJMbSQDRZuFKs7Lt3cnyc47lSzFbAwikIe6ouG5Qb+ScfvBsrlVdQIckx5XC4/J0b9FqwAU3XeMRp911EgEnLnxGVp/7/uzGMXXbNN7HzHnhiDYlpJveV8SMt5QkL4g== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(376014)(7416014)(36860700016)(23010399003)(6133799003)(18002099003)(22082099003)(11063799006)(10067099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: SXFxBKgIwi+s2AxlKK72hd6jORKIhfaU2a+ArX+pF6lMTgwG6PWittbZwGc2vkaTVvZo2UCTmpAKKzL0xoY2N8e2p0XhXnMeYEZsMMxiMLfKDIMXM6YaXQoqce0ut8ELB81O757Vq5bGDUMPTiDHRnZ1s1JPY3d+q3cCajg5cgJ2DvX0tt484W9PgFqIYvVLh2Bauu3C85VvVdpuoQbHGmHq3/4b2+YjXlOBnSstZRbXf9b3O5tA8XsC0n5Kodj3qYaKL4P7eDccsNrwunHUnqM5Gho9IEFDT98tEOj64SDG3a30ZFsXYEDyRS9JqRkiPrlg7jXVOdrjTfSuul/fQnO+no2heEiNYeDDRPIwhgvAws2RdtpSy1fU+IXB0Hiswp0BuLh+14keISZ5zHrqHFTo2nz3wDfJGfuXt48LKakxXt60FCAQyN/71BFwNKPh X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:50:56.0205 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 67756681-2525-4c48-0455-08df1234e8ba X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018547.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB6784 Content-Type: text/plain; charset="utf-8" Temporary BAR1 access needs a borrow of the GPU-owned BarUser. Store BarUser inline in Gpu and borrow it in BarUserAccess, avoiding a separate allocation and reference counting for these accesses. Update the existing self-test entry points to accept the borrowed interface. No functional change is intended. Cc: Alistair Popple Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gpu.rs | 21 +++++++++------------ drivers/gpu/nova-core/mm.rs | 5 ++--- drivers/gpu/nova-core/mm/bar_user.rs | 27 ++++++++++++--------------- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 227531b28541..ebf29b06a8e1 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -16,7 +16,6 @@ SizeConstants, SZ_4K, // }, - sync::Arc, }; =20 use crate::{ @@ -327,7 +326,8 @@ pub(crate) struct Gpu<'gpu> { /// the GSP is still operational. mm: GpuMm<'gpu>, /// BAR1 user interface for CPU access to GPU virtual memory. - bar_user: Arc>, + #[pin] + bar_user: BarUser<'gpu>, /// GSP and its resources. #[pin] gsp_resources: GspResources<'gpu>, @@ -523,19 +523,16 @@ pub(crate) fn new<'a>( }, =20 // Create BAR1 user interface for CPU access to GPU virtual me= mory. - bar_user: { + bar_user <- { let pdb_addr =3D VramAddress::from_raw(gsp_resources.boot_result.static= _info.bar1_pde_base); let bar1_idx =3D crate::driver::bar1_resource_index(pdev)?; let bar1_size =3D pdev.resource_len(bar1_idx)?; - Arc::pin_init( - BarUser::new( - pdb_addr, - gsp_resources.spec.chipset, - bar1_size, - bar1, - )?, - GFP_KERNEL, + BarUser::new( + pdb_addr, + gsp_resources.spec.chipset, + bar1_size, + bar1, )? }, }) @@ -552,7 +549,7 @@ pub(crate) fn run_selftests(self: Pin<&mut Self>, pdev:= &pci::Device, mm: &mut GpuMm<'_>, usable_fb_regions: &[Range], - bar_user: &Arc>, + bar_user: &bar_user::BarUser<'_>, bar1_pdb: u64, chipset: Chipset, ) -> Result { diff --git a/drivers/gpu/nova-core/mm/bar_user.rs b/drivers/gpu/nova-core/m= m/bar_user.rs index 1bef01d147ad..2e6d229b1a23 100644 --- a/drivers/gpu/nova-core/mm/bar_user.rs +++ b/drivers/gpu/nova-core/mm/bar_user.rs @@ -7,10 +7,7 @@ io::Io, new_mutex, prelude::*, - sync::{ - Arc, - Mutex, // - }, + sync::Mutex, // }; =20 use crate::{ @@ -60,12 +57,12 @@ pub(crate) fn new( } =20 /// Map physical pages to a contiguous BAR1 virtual range. - pub(crate) fn map( - self: &Arc, + pub(crate) fn map<'access>( + &'access self, mm: &mut GpuMm<'_>, pfns: &[Pfn], writable: bool, - ) -> Result> { + ) -> Result> { if pfns.is_empty() { return Err(EINVAL); } @@ -73,22 +70,22 @@ pub(crate) fn map( let mapped =3D vmm.map_pages(mm, pfns, None, writable)?; =20 Ok(BarUserAccess { - bar_user: self.clone(), + bar_user: self, mapped: Some(mapped), }) } } =20 /// Access object for a mapped BAR1 region. -pub(crate) struct BarUserAccess<'gpu> { - bar_user: Arc>, +pub(crate) struct BarUserAccess<'access, 'gpu> { + bar_user: &'access BarUser<'gpu>, /// [`BarUserAccess::release`] [`Option::take`]s this; `Some` at /// drop time means `release()` was never called. mapped: Option, } =20 #[expect(dead_code)] -impl BarUserAccess<'_> { +impl BarUserAccess<'_, '_> { /// Tear down the BAR1 mapping. pub(crate) fn release(mut self, mm: &mut GpuMm<'_>) -> Result { let mapped =3D self.mapped.take().ok_or(EINVAL)?; @@ -162,7 +159,7 @@ pub(crate) fn try_write64(&self, value: u64, offset: us= ize) -> Result { } } =20 -impl Drop for BarUserAccess<'_> { +impl Drop for BarUserAccess<'_, '_> { fn drop(&mut self) { if self.mapped.is_some() { kernel::pr_warn!( @@ -180,10 +177,10 @@ fn drop(&mut self) { /// address space. Uses the `GpuMm`'s buddy allocator to allocate page tab= les /// and test pages as needed. #[cfg(CONFIG_NOVA_CORE_SELFTESTS)] -pub(crate) fn run_self_test( +pub(super) fn run_self_test( dev: &device::Device, mm: &mut GpuMm<'_>, - bar_user: &Arc>, + bar_user: &BarUser<'_>, bar1_pdb: u64, chipset: Chipset, ) -> Result { @@ -386,7 +383,7 @@ pub(crate) fn run_self_test( drop(vmm); =20 // Test 4: Exercise `BarUser::map()` end-to-end. - let bar_user =3D Arc::pin_init( + let bar_user =3D KBox::pin_init( BarUser::new(pdb_addr, chipset, SZ_64K.into_safe_cast(), bar1)?, GFP_KERNEL, )?; From nobody Fri Sep 25 10:37:46 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012035.outbound.protection.outlook.com [40.107.200.35]) (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 B66E93B71A4 for ; Mon, 14 Sep 2026 07:51:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.35 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372270; cv=fail; b=aZCvLwLx5BO/WLGzWUbsaZFDbVw8JieG6DfE9aYU6oKmTZ8vTNOpIYIqYzC1FJu195GX7kh+aXlb5mPFKCSVkGyTdYBVsMfUiEOK8bjFup7Re4qUdB6IZEwfqd2zdXgCLOKOGRF7EtG0815BW/uozTQ0an5EOGd51hRCc6kzzJg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372270; c=relaxed/simple; bh=8nhpYifx0NWyL0dsar5Nf3XxNtxbG3n+do8w0L9Ps8k=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZF479QNRmMVlX7VRhEr9MV99GXNMYARqvFHNiaLFUnSyB4+EnT2cC3PubtazMk7gB+r7uNvd/YdfJq6mQWBTQrKeZDeAu0qAa8XB2CNh8vjDRWMeNJezbzrriDDzezXOqvN4+XJIiWGliJIrQjvwnZh6I+LXDwQTcw8JQHfphqs= 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=qgRSzvn8; arc=fail smtp.client-ip=40.107.200.35 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="qgRSzvn8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=N6vFy/DJpEBHaQ9XKGqFkdTEea9X5PdbP+HMcE+DcGkPqI8KdUzRDhablNHt8MamjIBLuc9zWmIiV4G1+ZW/SdXsG3BfVJmjYTSLKC0/bK+1/g+28dgrvsWCHHc5Zu5IKkcaio0r82glioZyFC1jXvXq7MuPz50lretSeipgQ8Je9rsJ9teIKvT+8FCymTQrdtd4HePvQphZP02lMNqZ5/6J7O/X6jXqCwpsczgCYQmYaFjvH9RDTjBsf+Y1v6jljFEw9L0q10amS4P3AXZEpN0iolcKX6w8RQNlNu2llIxecELbKAq428bA1sJ7zhOXSpGPNXwmEzMB7oCmI6biDA== 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=KgI0ew9AY8TJ6IWbSJzOcOPB+4nX8GISq2hZpBH6xmI=; b=gTtRxoY6iBq3vTFBrJFpZFRch9ZL/TyYX7qMACaquFHwcURN/UG+HwsqHXfeRb7/2IgCcbF0o5eiQmSqSSr6pb8b7EOfHhzF1btcAFlZjRktUsA/iYaa9Vo7bcbznHNrvDq/nYZqgRKdMzpWwdI04GaUbcJT8pPVFI27MBYKHbAPYq8/2GFkhxnIxY/zJ3aZgg8/f3dE0qaJRoX1Vap/AZCdxRSFC3QkoSq+ryTfG+GijN5liTy7Gd/xX2mZPqKMAeg0eluKXPkAxumrUEFFjBHUjvl3ThMdalUsrXY+SnsC82rYITAx5oKFW/ny9h+1PS0fb8Wp/7tHzRrsiTfhSA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=KgI0ew9AY8TJ6IWbSJzOcOPB+4nX8GISq2hZpBH6xmI=; b=qgRSzvn8ZaWDeq0AYr1/l245CzZccxNyGWiS8srfNO10eG3Enl61O+FIdh/ZmfrR+sb9ExOjbltj7k2hzlaZQHwblBlukFK8Up03+JzH8rjMVH+h19Ox+Ld1dF1GPUvayLlnqizThm0KMEmmxb+3ixBgkbAWDXmxBiC9MTuwnOQlbKCOquoWuWhRBhHWLWnt46Kv3T1afJanYzqJM7BZw9e5erahWat1sgPI39dpUN2ubyVCjj78MegRmxhdKNhSQMwDwr61xCZo1Q7q6skkubmH1cE3U2VbpViKvOWxXrqzitWaH860YDfZw26LgyWtBUwVZaGKxbfsL+eRVe563A== Received: from BL1PR13CA0124.namprd13.prod.outlook.com (2603:10b6:208:2bb::9) by LV3PR12MB9120.namprd12.prod.outlook.com (2603:10b6:408:1a3::5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:51:03 +0000 Received: from BN1PEPF00018547.namprd05.prod.outlook.com (2603:10b6:208:2bb:cafe::1a) by BL1PR13CA0124.outlook.office365.com (2603:10b6:208:2bb::9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.428.8 via Frontend Transport; Mon, 14 Sep 2026 07:51:03 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018547.mail.protection.outlook.com (10.167.248.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:51:03 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:45 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:43 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:50:35 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang , Alistair Popple Subject: [PATCH v2 10/32] gpu: nova-core: mm: add VramBlock Date: Mon, 14 Sep 2026 10:48:45 +0300 Message-ID: <20260914074907.1399629-11-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018547:EE_|LV3PR12MB9120:EE_ X-MS-Office365-Filtering-Correlation-Id: 6febbdbb-5b85-428f-c35b-08df1234ed1c X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|7416014|376014|1800799024|82310400026|36860700016|22082099003|18002099003|10067099003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: hNKpLh9zysKRlXrNaTYR+oPUYAZ/d9ZxhO8TKbdpQhhZeTUtqro7w9Yi/Rn5RWHyNAQYG1O3gV+6CuC1HJ6HhOs6v01OSjRjSaMqqpHgKYsF9674LI1WEp8BojT0zJDR2d5lVRx+QgiVjd/WW/lch4RkLp75LCbwsvYBGFv4/k+01eq8wgOZrtKzlH0gQYJ0s2lNNYFxwxMtA2FkgvCzMBWXDm1f/ek1BK59gqgsErDbw6qQrzqs3YqmnrhDR385sxlg69XEy7hmgrIH8OV73kRziwadfIQGTGtYoxfJ67tnohpVhmUPVi7sCF7oFScfEpY9jd7enwb91enWl+PvFdc+CpSZgL8bcsjO58m/5RIqNKMNmXrYoZeTDhh6PMq44nAKcwntBdQU7lrJhvnRBGB4PjCE+uexW7BCq2bVUz+lz45uteMEnypZK0exfyd4R/0FIfGC6iZoCCEEaIySqa40vJeAGgmMvN0sN7NBmjpNthKc4mogSFKL6tucer9rDzqLAKF3rBWqq7sghDR9xYkDgTAFdWg1JghaK3BNMTqqUd8UvkVxdZfv/WmfF/Ohg0zxwExjSPDz8rwQ/lHtVoiR12QGzmspXb8Mv2HqVxUr+wLFjNRAYQMzBmypXctPpMEf/KDwq8hiebx5Z4mJf5/u5kSMlg+6/SQanyXqfbv06gvlUeIHR1tmZYsVoxl2 X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(23010399003)(7416014)(376014)(1800799024)(82310400026)(36860700016)(22082099003)(18002099003)(10067099003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 9Xgu2HLvPXli57on9jpBohrnH+9H6UECgdLL+Li3TzlikxTRjia1Zvd1L/svTb1zvP/ok+ks3FIZ8lBzPACa0H/zs5tHlPmer2gDuqcx9MJuBwC9BGfi8Gf+6jJMliHl/PloaaHCrlRhgnm7xU/0yDemGBbq6jJvA1Ry/3qTFXDfNd4sp8UaJXXqIsrELQVtVSIKNvWWr0kTqLBNz9wQvA8bJEbYbhqZvOITsenyeKZQCjbtXLM+iT8jDsnQf0w7KN9TGGWUtfPlV14leoGamKqee7V4u/ildVcXaxA5U/3MKTjOOZpWjNmirbttYOVSOvKxBvImkCW4Xqsmqnx9cTyyD7njgDmJOMTM0irJdCxk2vFiM+Q4MxbWGt9uMy1tB7XfeMGjMvIvKAwIppqbIOswqMwzquszewpPJjH0Om340vOvJi3zHQ93HVEaG29W X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:51:03.3754 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6febbdbb-5b85-428f-c35b-08df1234ed1c X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018547.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV3PR12MB9120 Content-Type: text/plain; charset="utf-8" vGPU memory slots need allocations at fixed offsets within usable VRAM. Add GpuMm::alloc_vram_range and VramBlock to own these exact allocations and return their storage to the buddy allocator on drop. Use the buddy allocator's range validation and retain the checks for absolute physical address overflow and alignment. Cc: Alistair Popple Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/mm.rs | 2 + drivers/gpu/nova-core/mm/vram.rs | 78 ++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 drivers/gpu/nova-core/mm/vram.rs diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs index 8a934c55169f..016d99608aeb 100644 --- a/drivers/gpu/nova-core/mm.rs +++ b/drivers/gpu/nova-core/mm.rs @@ -67,6 +67,8 @@ macro_rules! impl_pfn_bounded { mod regs; pub(super) mod tlb; pub(super) mod vmm; +#[expect(dead_code)] +pub(crate) mod vram; =20 /// GPU Memory Manager - owns all core MM components. /// diff --git a/drivers/gpu/nova-core/mm/vram.rs b/drivers/gpu/nova-core/mm/vr= am.rs new file mode 100644 index 000000000000..743a2a163318 --- /dev/null +++ b/drivers/gpu/nova-core/mm/vram.rs @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! VRAM allocation. + +use core::ops::Range; + +use kernel::{ + gpu::buddy::{ + AllocatedBlocks, + GpuBuddyAllocFlags, + GpuBuddyAllocMode, // + }, + prelude::*, + ptr::Alignment, + sync::Arc, // +}; + +use crate::num::IntoSafeCast; + +use super::{ + GpuMm, + PAGE_SIZE, // +}; + +/// A physically contiguous VRAM allocation. +pub(crate) struct VramBlock { + _blocks: Pin>, + address: u64, + size: u64, +} + +impl VramBlock { + pub(crate) const fn address(&self) -> u64 { + self.address + } +} + +impl GpuMm<'_> { + /// Allocates an exact byte range relative to the buddy allocator's ba= se. + pub(crate) fn alloc_vram_range(&self, range: Range, align: u64) -= > Result> { + let size =3D range.end.checked_sub(range.start).ok_or(EINVAL)?; + let align =3D align.max(PAGE_SIZE.into_safe_cast()); + let min_block_size =3D + Alignment::new_checked(usize::try_from(align).map_err(|_| EOVE= RFLOW)?).ok_or(EINVAL)?; + let buddy =3D self.buddy(); + let address =3D buddy + .base_offset() + .checked_add(range.start) + .ok_or(EOVERFLOW)?; + buddy + .base_offset() + .checked_add(range.end) + .ok_or(EOVERFLOW)?; + if !address.is_multiple_of(align) { + return Err(EINVAL); + } + + let blocks =3D KBox::pin_init( + buddy.alloc_blocks( + GpuBuddyAllocMode::Range(range), + size, + min_block_size, + GpuBuddyAllocFlags::default(), + ), + GFP_KERNEL, + )?; + + Ok(Arc::new( + VramBlock { + _blocks: blocks, + address, + size, + }, + GFP_KERNEL, + )?) + } +} From nobody Fri Sep 25 10:37:46 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010026.outbound.protection.outlook.com [40.93.198.26]) (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 838E8282F21 for ; Mon, 14 Sep 2026 07:51:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.26 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372274; cv=fail; b=Z7AAo3yZpBOtU4O+0O4ZWgNa7IMKstwNsrBt0L6qG+TbKwAKv2MZZ4c8mn2C2W6Lky4uxGQ3h4DFmpxbIxmLxhJXarQtgDMVGE18UtRkJ91c5GdNpsz2vwIAXb1pbeDi7MV9OFzhT/HgrvQiliHPNoENQlcZldyozygYkqft0us= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372274; c=relaxed/simple; bh=BEnZ9y2kwDoQKvqE0EFF+q89bU6AkZjud4BrNh3PC4w=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=n7PH9fGKefd7tlpl1hBfybA56ugaxIQDqBaaipbQB9yNAqPcw/Ja+EXK4slUiOiJzaJYvY/CouPrbUpOS+yWbPqCeGXQwkTSSTWPcd/ob1HRuEH8UCNshrQvGnWo9CojMctvo01kXKl5HGgscUrZf0YRdXROQhiEenJ4x9lFIfg= 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=Cti2SgqE; arc=fail smtp.client-ip=40.93.198.26 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="Cti2SgqE" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=y1WCX5IBrNZVEqtEHOS2c84I3UO9nxI8u93eAPHWCCFu+Bz9/IPGqNbDGpUR3gw7qg5c+ZdVZyt3MflWYyr0XGXVIW2N/2DW1FoRXuBYLaohTtf89AVzOBS8yOLUnzP1y8tV4G1uZNOLMS7xndZgizEUS0YCIFu8TBF4vV+kECHyvpTK9YENSoLtr2QvaEYS3wPJaXk7m/YyMl11Pqkj7P1H9srY1R1ZQfdvaq0tVqKOjUChZ3GQPgq4GAqXYZFa5ktd269cbxDJk3JUwoU8GMOsTsRyBH8fl8v1uFf2ZzMcArWt3NokhdEFji0iCYwAqLgSYg5RsMuqm0qlzLx1Iw== 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=KmSTn4DBLqZVF2JzDeHUohqPQ8Q1VmArWPB8Y1avywk=; b=Kzn9r5AZ7gInZGz99VOUlt4y7EuVde1cJxqLFBKB76bP+y32ahShkvYxLO7P2JX9pgDj5cjOVbUpXrHqrdoqbAPGZ82eh4DTMlQsUlO0Eu6QjYWAOkx2OgeCxSLZ/sOyPKd23k7LU86CLUNa3KXjLeSO575YQJsQUACxmHS0l2ZXWdQIOL7ESHA+rMAHNLGp3cCa1J4WTkXNkJMXdtFOQeRKYXkASjtMKcwxZtN8SyMFuXU3glCcNH+i9TaFBL25zHrVgx05bHiEeLHrUEAIxRkzVcYbty/lyGMSmR6s2MHtghWw8KonRGm9u05WfDF4+sbLYQrSQX+mGWXGR1OK8g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=KmSTn4DBLqZVF2JzDeHUohqPQ8Q1VmArWPB8Y1avywk=; b=Cti2SgqESpUzFZUO18uXwjLzj0NZhpPl42ZjCWJIjkmhV7w8r/6TAX3faWlZ4WenNfHvgoGG7plu1tl4UuQxdu2a/5hRK2a3vjw1we6pNBqI7UDWCIiJKNAQsG1PlgytquBdNnpIHAQPF/DzVcTuXEAXB6JNJMK8FkvngeZHdXrc+cu8kHRJ1N8Dm2P72+2jt9/rxEg4Qnd9EWSAlje3cz8T9wYwUM38E0DG2/9k4dIdRJnfMHkNku54u2jt5q4IsORQrrRwQ03XDdJlQ625uIP9CyW8hJr5hZle4d8JjPGWr0yZCLHhSkV2wG4FUI4djwPSVGpj1O2Rp2pn03MEKQ== Received: from BN9PR03CA0374.namprd03.prod.outlook.com (2603:10b6:408:f7::19) by SJ2PR12MB7919.namprd12.prod.outlook.com (2603:10b6:a03:4cc::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.10; Mon, 14 Sep 2026 07:51:07 +0000 Received: from BN1PEPF0001854B.namprd05.prod.outlook.com (2603:10b6:408:f7:cafe::5e) by BN9PR03CA0374.outlook.office365.com (2603:10b6:408:f7::19) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:51:07 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF0001854B.mail.protection.outlook.com (10.167.248.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:51:07 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:53 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:50:53 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:50:44 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang , Alistair Popple Subject: [PATCH v2 11/32] gpu: nova-core: mm: add VramRegion Date: Mon, 14 Sep 2026 10:48:46 +0300 Message-ID: <20260914074907.1399629-12-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF0001854B:EE_|SJ2PR12MB7919:EE_ X-MS-Office365-Filtering-Correlation-Id: e3118039-f2bf-4b1e-f118-08df1234ef90 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|1800799024|82310400026|23010399003|36860700016|11063799006|56012099006|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: Uj5hKIQWCnsPYnqvp/bUDwzB2K/G5cQOWWZEBEGcWWXiEiAWPViXMEA/koIrkgwBH2zCOWooilUB7vXGL0S88Us2HI9Mc5VCR5a3WN3vPZcnlS2p8OrVuGd6a1bEnGUsCFkW572NQG2tir9s9qR0ZvgN5YkFCw64ZoSJSMAECUBRoFmccLSeY9R/ouX9hvdUGfZLFr0hFr46PIAKQlGZMHje/4vNEfD8plsXerg1Ixl3wv/7dRn82dUBy62WutSvmgwHQ1PxcMvoZq6gu+GRqIluG/MQ4nkol5y8tAyQOUjcd41sxRD8VCDir3RThtKBKgbBtsJCDKvrARm8Zt78yANXL1Ads1+1CkihlBI1lx5lTHnaLGqnw3znFQQSOOrpR7if9S0P0cJkD4RDo60oSx1p1P4/j4EJNqcG2mleSgms0NWS0Wx8/ocrNjaWJGj2ZQllS5ibKmtX9HYVIXCcwzTqw+35qI/yI3mD2bRqzJxgtciZE84W0nuNaPH1TJgQRkN1yWvwuD6Tbf/yML1MjtbO+GRXokzWiqK76NN80cmieJblDnm/lWuusYrk05k/bRxYit8Hj08TeSeZFv6lQVaiT1egkrChsvFBmMUpEI/6m8OIv3LH/IOl/YZlpqBdl7IE9K/ml367xrZd9DaiD79T+sSviVXHXc/hhJBUm1UlzTscHl4BmHKieeT+ez5JTHGeDHyYaqTxm1C6kO+3MA== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(376014)(7416014)(1800799024)(82310400026)(23010399003)(36860700016)(11063799006)(56012099006)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Z+UbeTa50VV2EyC5d7eQO7dFyvC8MdlAUuWBCIQjiIh+E5IKFLSlki10T4gKcqtOeXPb0euqLn67Jz5hHivFK/GBA6zVBLK35ox1y5X+fjaGtZPT6B+8RtNMaWafzvi3QgcHIl79NMOhqUrwkFozv8KWR/QVhoKIr/Le+lxRaUpaKDEApuFy20oT3FAIaLG+4A1aQETqdtYoZNDmKC0oTTiBpyOx6hYf0nS1aecIxLCbuvZNQk6tsxml+CtdCGBjG+UdAOR/JlYG1zJxCVmhdQ3M0XqSlsrWdVy2urcdRmf15X9bQQF+Sryz3ABboYvHuPbUrdar6Okl1wY9JnmLjTnlfRiRMXQ/t6UZoQTjx6YY5RpK90tZ4h/WHR8/wNqzzlsjnG2D3YjsYro5zUZ9Glx7nAz5wfiRP487YxrfrrkGqoHZbBQzHppK1/qki3aF X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:51:07.4843 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e3118039-f2bf-4b1e-f118-08df1234ef90 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF0001854B.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ2PR12MB7919 Content-Type: text/plain; charset="utf-8" BAR mappings do not necessarily cover an entire VRAM block. A region layer lets a mapping select a byte range while keeping the underlying allocation alive. For vGPU, communication buffers occupy only part of the management heap and need a BAR mapping of that range. Add VramRegion to describe ranges within a shared VramBlock and support bounds-checked subregions. Cc: Alistair Popple Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/mm/vram.rs | 62 ++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/drivers/gpu/nova-core/mm/vram.rs b/drivers/gpu/nova-core/mm/vr= am.rs index 743a2a163318..2c7183f08027 100644 --- a/drivers/gpu/nova-core/mm/vram.rs +++ b/drivers/gpu/nova-core/mm/vram.rs @@ -34,6 +34,68 @@ impl VramBlock { pub(crate) const fn address(&self) -> u64 { self.address } + + /// Creates a byte range relative to this allocation, retaining its ba= cking storage. + pub(crate) fn region(self: &Arc, range: Range) -> Result { + VramRegion::new(self.clone(), range) + } +} + +/// A byte range that keeps its VRAM allocation alive. +#[derive(Clone)] +pub(crate) struct VramRegion { + backing: Arc, + address: u64, + size: u64, +} + +impl VramRegion { + fn new(backing: Arc, range: Range) -> Result { + let size =3D range + .end + .checked_sub(range.start) + .filter(|size| *size !=3D 0) + .ok_or(EINVAL)?; + if range.end > backing.size { + return Err(EINVAL); + } + let address =3D backing.address.checked_add(range.start).ok_or(EOV= ERFLOW)?; + backing.address.checked_add(range.end).ok_or(EOVERFLOW)?; + + Ok(Self { + backing, + address, + size, + }) + } + + pub(crate) const fn address(&self) -> u64 { + self.address + } + + pub(crate) const fn size(&self) -> u64 { + self.size + } + + /// Creates a nonempty subregion relative to this view's start. + pub(crate) fn subregion(&self, range: Range) -> Result { + let size =3D range + .end + .checked_sub(range.start) + .filter(|size| *size !=3D 0) + .ok_or(EINVAL)?; + if range.end > self.size { + return Err(EINVAL); + } + let address =3D self.address.checked_add(range.start).ok_or(EOVERF= LOW)?; + address.checked_add(size).ok_or(EOVERFLOW)?; + + Ok(Self { + backing: self.backing.clone(), + address, + size, + }) + } } =20 impl GpuMm<'_> { From nobody Fri Sep 25 10:37:46 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012046.outbound.protection.outlook.com [40.93.195.46]) (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 14891282F21 for ; Mon, 14 Sep 2026 07:51:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.46 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372284; cv=fail; b=mCWoqqyBusqB/wVuxzDHZUxcRCtXcy5LUa2J4Ndd1PVR9E9ff2EHslSPb0fHlMPYR67zTANJJVAawu/8JjYtEU0OzN7DcQtvWb6nbvz8Cbd+vDdKcd5Ne2oEl6s0TFdi3VR2QOZgr6NbCxow5Ny00nqF7aTTM0qV91im+oMS+lA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372284; c=relaxed/simple; bh=mfXcIGdbaSRVftlmzzXwm8BGDzmSulxeSK30s/AjWIA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZLwZW3xV9iuFK0C/8TIRA/0vnL+YE7rGYE3DxhK69SJ00FX/1BjNZrEOtWqsBoa2pexx6rm5uBvj3LC2g7iKdhdbnTIXAUO/BCHsFS8cQQYJOZ0Dcg+awbvBJP2Z+IVQLIula/liysMDiNKFPYBFT4CLIVOq65gSwF1+wiAIeqI= 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=roG8PYxJ; arc=fail smtp.client-ip=40.93.195.46 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="roG8PYxJ" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=b/VS4QDUwNgn30zHnxoscY3Y2Rd4kmSH3CSUo1HJTyjgQrdQQGsceL7ZGGFP3xU0f5qX2bp+7HmZOz/+dbm6pNqQZI+KnOmzsIR63vfwD4AYaK+BEO1MmvrfvLdRPUoZ9tbY9hR1pPE5qdTC8suwJ/jkxm0BOnjFHNKkcQ0zo2//gwnMYKTZqnrjON/XXc8cy0DbHdZexKy2s0V/PihIIk80EchCOpRSLpDeSCNzWwspuxquJj8Xb/ZWtqGwDdlIL5QliHrsIOnBTj02oTPeSjRVwBLfdCvht9Y0wbFS231NJ66IsOk41GJyvcwzfVZw/x1aW3EjtUYKsU0agTO0fg== 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=4Pd2Uc4T2DpRCIPK7uxVNy1mVATtp2wxzVQJuyIcZxg=; b=TTRy5mIdWSxAZ+dyTAsXOXAbLnERK0yiYlILmkMk/cLVr1oTfJ8ccwWh3O9uCcrLZIZ9qLymas+bykovzqepaTleqqkeaAMSTPh237v+SurlJ33w0VqBSK5xGrCxR8tbO6bCEYBpYP/qflvcJimyNGcoVp8sQ3p5ae1GW9OVsDqkIC1MMliD4K962Nm2MhJWGH2aTAOEFh6aTAFLO1Io9jN28KaUzJ1ajUtFLHxdPQdnV4KzYVWT9zLU662LL7mb0qmDr0Fvw3pbcxxza8QyolpLkGgHnJN2uMGinovALWLMLEz8kXiBxOw99zYOqr4SAMWEPoMBOG2F1JjVDNv/pw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=4Pd2Uc4T2DpRCIPK7uxVNy1mVATtp2wxzVQJuyIcZxg=; b=roG8PYxJiqcBJFeVT4xu19ACtCQOiEYib6z+WkmQ34QcbOO2nZm96dSFw0fQsO9TlV3jjAbvgMOSk+++xRwDexd5F4jzHMf+lI3oW5DFUuwbluu/0G/RLe/2gS9Wmj15l1GK8F/urAwce4O1z8kQcnyjer8lhwfrASoMRtpqihrCX9Oz9SDbM4DgIIwQEZgoosVMkmT21WdGn4wlWpiRECG0CyoO6KaJstWIM+AeLBbmAksxmEPXGaU5AEuW78QbkIihHMnz08HQnsI/do+bvp9qsmHd7OAXLVyyCdhynAe66s7EoGhDt/D9EDw+f+ZUM+nxPf6rm+4NT7cJL1Fqng== Received: from BN9PR03CA0549.namprd03.prod.outlook.com (2603:10b6:408:138::14) by MW4PR12MB7384.namprd12.prod.outlook.com (2603:10b6:303:22b::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:51:17 +0000 Received: from BN1PEPF00018546.namprd05.prod.outlook.com (2603:10b6:408:138:cafe::69) by BN9PR03CA0549.outlook.office365.com (2603:10b6:408:138::14) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.339.12 via Frontend Transport; Mon, 14 Sep 2026 07:51:17 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018546.mail.protection.outlook.com (10.167.248.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:51:17 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:02 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:01 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:50:53 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang , Alistair Popple Subject: [PATCH v2 12/32] gpu: nova-core: mm: add BarMapping Date: Mon, 14 Sep 2026 10:48:47 +0300 Message-ID: <20260914074907.1399629-13-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018546:EE_|MW4PR12MB7384:EE_ X-MS-Office365-Filtering-Correlation-Id: ea93cce7-a2be-450f-b4b4-08df1234f574 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|1800799024|82310400026|23010399003|36860700016|10067099003|56012099006|11063799006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: lzTAoVW6HLUw7Aw92ZH2mg9Z6BYEOobZASZLGpjKtgDzjweQxfSMFgZtwloLreCyhlSTt3qKeb/mVb6jeBM3kKMlElQoYxLIYmiFj4LO5YOo706fT7gGuRx4MgF/VI5RyE5eljPhiosODMBFxAnsTWQYvp568LcRT71bQhBYbJui4feDhgQgeE4DpaR4bUh/IlnXdOHmzIm7pCjc7jcIFaH2UmF7s9QiyfW2Ycbkm4y6yJggKJ2bXDJGhxIy9pKr+VTw8A762y9WVHz2VYYpPORsWFUsdeWbx2/Dpbiep1xmVsot2VygPZ8mDZ2SjRRD3lf0slmcuKyetQoOZUT+9ccUCNIEwHA33rvoFb+xtskP/wolTmY+DAzk/uQNLBh6uublaAS6Q0cgpo394kQq+eIqso+PDB86+QA746N0yk6oPla6ibpICol6J8vIEU7DmnuPr09azgh8y/YdFTDFuViZs8/+i26soXP4sKlHMUVz6LdPZ9FolHJsLw1ilRmvcDf9z7a0iFG4Kjqh/indn/y0F569aw6z7QdiQTqWx6FCxY22Nx0GB2J6rCWn8EA8j17v41TnK3YLML3ejfrzo/c4RqYVM8+54v3cq9v3KJtb1KZ06OSC7I0wofjJKPDnyOQreRjYitrrcXa4x6a5LYUExH811Wwkvm5u8UdL0YfO8udugPqZS+rW11xh7H4WRDfVMHgaq3Hytb6lLpHWAQ== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(7416014)(376014)(1800799024)(82310400026)(23010399003)(36860700016)(10067099003)(56012099006)(11063799006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: slUGZr4RF032i1AJPKbhTYGRHPgIVJB6qYRz7tFADyIux9u8uhYDkc80cvEBlDVpiVJKwjgP4wecSnybzRYjfBH2NNdB1u0FxmXQgTbp50piDrZk5O7hQBIZeenOCVo/6GkTnAq40eNrVL4dEEaM7bk7VuHul3BBQhFc+D0g1aU5UKvlO5epnlEKydvaZ+gVFr/v/a8Py7A9D4XEE4VmjZb9QzxkZM22ZCG4TGVlwbZYLE1W3GcrJBhnJpZH+u5nvHLIc1m7Loc0amEqDUe/iRXi10z8mB3HOkyYubnrgTqGDe6wVlHDLh2vUZhi0bC3m7sJ1KZPNF7LMtCeEdgyezLwhB12f2iZhlf4pGRbVnCQu8NXbfYBIEb8ROlk7tLpt1NS1Fqa6C2VSA6PkglBQ2rALTPWsYJNalebon2Wc/ob4N5dP1bXje0e94ByusIY X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:51:17.3701 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ea93cce7-a2be-450f-b4b4-08df1234f574 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018546.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW4PR12MB7384 Content-Type: text/plain; charset="utf-8" vGPU communication buffers need CPU access to regions within their VramBlocks. Add BarMapping to map these regions through BAR1, including regions that start or end within a page. Use BarUserAccess for the mapping and retain the backing region until destruction. Restrict CPU accesses to the region's byte range. Cc: Alistair Popple Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/mm/bar_user.rs | 105 +++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/drivers/gpu/nova-core/mm/bar_user.rs b/drivers/gpu/nova-core/m= m/bar_user.rs index 2e6d229b1a23..ef357fd516b7 100644 --- a/drivers/gpu/nova-core/mm/bar_user.rs +++ b/drivers/gpu/nova-core/mm/bar_user.rs @@ -18,6 +18,7 @@ MappedRange, Vmm, // }, + vram::VramRegion, GpuMm, Pfn, Vfn, @@ -171,6 +172,110 @@ fn drop(&mut self) { } } =20 +/// A BAR1 mapping that retains its backing VRAM region. +/// +/// Unmapping requires [`Self::destroy`]; dropping this object does not un= map it. +#[must_use] +pub(crate) struct BarMapping<'map, 'gpu> { + access: BarUserAccess<'map, 'gpu>, + region: VramRegion, + page_bias: usize, + logical_size: usize, +} + +#[expect(dead_code)] +impl<'map, 'gpu> BarMapping<'map, 'gpu> { + /// Maps the containing pages while restricting CPU access to the requ= ested byte range. + pub(crate) fn new( + bar_user: &'map BarUser<'gpu>, + mm: &mut GpuMm<'_>, + region: VramRegion, + writable: bool, + ) -> Result { + let page_size: u64 =3D PAGE_SIZE.into_safe_cast(); + let region_start =3D region.address(); + let region_end =3D region_start.checked_add(region.size()).ok_or(E= OVERFLOW)?; + let map_start =3D region_start - region_start % page_size; + let map_end =3D + region_end.checked_add(page_size - 1).ok_or(EOVERFLOW)? / page= _size * page_size; + let map_size =3D map_end.checked_sub(map_start).ok_or(EINVAL)?; + let num_pages =3D usize::try_from(map_size / page_size).map_err(|_= | EOVERFLOW)?; + if num_pages =3D=3D 0 { + return Err(EINVAL); + } + + let page_bias =3D usize::try_from(region_start - map_start).map_er= r(|_| EOVERFLOW)?; + let logical_size =3D usize::try_from(region.size()).map_err(|_| EO= VERFLOW)?; + let mut pfns =3D KVec::with_capacity(num_pages, GFP_KERNEL)?; + for page in 0..num_pages { + let byte_offset =3D u64::try_from(page) + .map_err(|_| EOVERFLOW)? + .checked_mul(page_size) + .ok_or(EOVERFLOW)?; + let address =3D map_start.checked_add(byte_offset).ok_or(EOVER= FLOW)?; + pfns.push(Pfn::from(VramAddress::from_raw(address)), GFP_KERNE= L)?; + } + + let access =3D bar_user.map(mm, &pfns, writable)?; + + Ok(Self { + access, + region, + page_bias, + logical_size, + }) + } + + pub(crate) fn region(&self) -> &VramRegion { + &self.region + } + + pub(crate) fn gpu_va_addr(&self) -> Result { + self.access + .base() + .into_raw() + .checked_add(u64::try_from(self.page_bias).map_err(|_| EOVERFL= OW)?) + .ok_or(EOVERFLOW) + } + + pub(crate) const fn size(&self) -> usize { + self.logical_size + } + + fn access_offset(&self, offset: usize, width: usize) -> Result { + let logical_end =3D offset.checked_add(width).ok_or(EOVERFLOW)?; + if logical_end > self.logical_size { + return Err(EINVAL); + } + + let access_offset =3D self.page_bias.checked_add(offset).ok_or(EOV= ERFLOW)?; + if !access_offset.is_multiple_of(width) { + return Err(EINVAL); + } + + Ok(access_offset) + } + + pub(crate) fn try_read32(&self, offset: usize) -> Result { + self.access + .try_read32(self.access_offset(offset, size_of::())?) + } + + pub(crate) fn try_write32(&self, value: u32, offset: usize) -> Result { + self.access + .try_write32(value, self.access_offset(offset, size_of::(= ))?) + } + + pub(crate) fn try_write64(&self, value: u64, offset: usize) -> Result { + self.access + .try_write64(value, self.access_offset(offset, size_of::(= ))?) + } + + pub(crate) fn destroy(self, mm: &mut GpuMm<'_>) -> Result { + self.access.release(mm) + } +} + /// Run MM subsystem self-tests during probe. /// /// Tests page table infrastructure and `BAR1` MMIO access using the `BAR1` From nobody Fri Sep 25 10:37:46 2026 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010071.outbound.protection.outlook.com [52.101.46.71]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A88DA282F21 for ; Mon, 14 Sep 2026 07:51:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.71 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372297; cv=fail; b=GiQyXRmtctNXQ+1uayQe1hrpJTahjQajPYMfMiwb+yUnuT6AnaWb46rJ6CdvrOHp9JeyvOTfQ5AAkN69UnlUwA4OId83tQYA5FaV5nRhqSA+EYnAaOr6AFpSSQ/+yqAalbqEcJv15vkDVw6H95ok/OsO3Avj0G6kQVfIg7o6BtI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372297; c=relaxed/simple; bh=TkH1O1xSq/rC5I0bVc2oacU3s69Bi0DhwPxoF29PUOg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=E6gSz+VEW5CdaQ0171zBbjeuJsYkolE++zw/SWgYeNQEqbptaJCt9ozuH6IoEnYpREkHDJ15fade/CNDRLB0LEp9St2tmvqaIBze3nvHaZCGHuthyJB458lIL+lyV6Fe/cprpzkuXy59DVn7AXsZnQPF6NJiD2QKQLCEgMjL+8Q= 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=H4TlyTJ7; arc=fail smtp.client-ip=52.101.46.71 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="H4TlyTJ7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=HcjSNYoCxsnlcOoDnn7o44NDRq+XgHIGR3fgWRdJr30Oec6Ai6NeHgiwhIb06QXZhAsoOsAZzA4wM8JhhQNm1FRUKUS0/k5vdk+ciOK3+yC3H2aKNeyBGr6KgGgh77M0r26XSCpqZ7Djz7znSa0KbaFzsgoIzzirBVGXxbeBE1AswA/er9bLN0EXYwaatn8STu88Wjd9argo8IkaF8LLl035ETNDCxvkHtx+Yur42Y/Qe/3jF4o2MxUotXx8vasy/HWgFjXRaKX//xzACV2MkvwSmsNA+rlpunNmhVAlSyIAEKeD9rF0a10VWEFesWscxnkdC/QnalRDcVuQux5UJg== 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=+33W/L/YIi66jzMvjqmCl5v+1G1uvM/ZsatH3YuCn14=; b=WxS1npUTApmB9TAyAIYqMJslnnb8mh+/nZts380Q29fLYK/m/kQ3rjFdQwy+2XmQVIVIXRr7jSklXKpgi8r9YhSRcSTYkMivAgVupi7AAedH/lvZytBoeXf6/ZLNuKJFsZbwhHMDNOxCbYfb8U8+OyyZJ71cLY6QNKzmzMTMeQbLohklKdKb52Pv7+cLiQ783tNTudF+goAoe1QZKVx7NprT1utdJdlNNgwCIR19GHXW9M9juWnv3EYuKst5zBVJ8tysnvMLZtnsAYUuboyRdc35BtesUae3V8x8tnuV0J9ElbKA0cLR2kBftr75MBIrVF7sGph9VuVC0WQwP39qhA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=+33W/L/YIi66jzMvjqmCl5v+1G1uvM/ZsatH3YuCn14=; b=H4TlyTJ7dFZAMrInn48v4uX7z/tfxjA7EcsU3Hd56VrOjIW1GECwTLcGt0iIHusFxDQdasrpy1uN9sMByekH9zYE0Z0xFNUpAE+QTDQkDOn0zQDcadZ1dhXMauWVKbofs0gM0EqZnBgix20DSMRPKXWgfZRat8CaulxiouAYT7rKdwbKhuGht/kfEnap9zNFRpesPOPz7en/7u5azkmuvLGcczhS1MZyFu/0hz+6gaKBCIURomRQIVdph7SKLfxIYEIk+8RoBBge8z1kRFN4kIvbvVc2tkPGxguxbineYbz0YvpOzXBFBoaD0hADguPGyGAbu/Ni7KgzhRiODEbQLA== Received: from BN9PR03CA0543.namprd03.prod.outlook.com (2603:10b6:408:138::8) by DS7PR12MB6045.namprd12.prod.outlook.com (2603:10b6:8:86::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.10; Mon, 14 Sep 2026 07:51:29 +0000 Received: from BN1PEPF00018546.namprd05.prod.outlook.com (2603:10b6:408:138:cafe::30) by BN9PR03CA0543.outlook.office365.com (2603:10b6:408:138::8) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.9 via Frontend Transport; Mon, 14 Sep 2026 07:51:28 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018546.mail.protection.outlook.com (10.167.248.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:51:28 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:10 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:09 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:51:02 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 13/32] gpu: nova-core: gsp: dispatch RM RPC messages during GMC receive Date: Mon, 14 Sep 2026 10:48:48 +0300 Message-ID: <20260914074907.1399629-14-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018546:EE_|DS7PR12MB6045:EE_ X-MS-Office365-Filtering-Correlation-Id: 4f9ff126-7090-4a33-df3f-08df1234fc40 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700016|7416014|376014|1800799024|23010399003|11063799006|5023799004|56012099006|3023799007|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: UV70rOD3C0Ih2Uacd1JDodd+I8lBtyXPX9JBtayAmH4dXUmor3WWbyNYXV/IrPP4HyzvRUNGhNnIaQiPuKsv3Suy0DZ+G9HlBexO+TkerTbonZxX2YlL+LqOw4ItU2jN7cdOMqQINfGnYKr/RTetpVf5jKZMXLV8HcTHgJIP4gV1B+oyemMw9D5mU/njuF5IJJdI2Hp/0t2jm0MoxN4yrZ8/0DmItzX7uSgDLsIG5qhpMAPvIZKqZzdg01++jEjOB9LxwIRHKonw0YzttWQOVwHKk43iH7mW/elBOFJxynrfYgcN3Y0yIt+ysQu4kpE5ch4ApbBNQE8bf/yFi+WY8AMuyc1Fb8aRlgr5zNad0VibhgJyPworXCQFG+tL1bsxa7ArXckjyhlnOOMTWldb71Dy+YCde0bwJLB8lIsUtE6tJA/O+M9O2zF/HzlJRIJ3H4OTRPR4nSHxXD94bjY9r0V39LHV1YbMmyMSatVM3iQbCynxW9JJxkKQp8jZprecCbrRDiEyFkpshbIpcHZbV3Hr+kGajuftIKLaZQa64brJjenIb7bN9AI5S4V5vouGAsiWuT6tMUhoIdxVRfqCm+M9QUPsRbvp+iXO7gy3lbpjZBmDe5JjqqcwhGV3jUYn/h0WdE/K/yS9+XtTXa1gDJ8iGEBYVipO8oQHdnj6lgL3NiLGkjjk7ITaLEer8070x8aOH1aGN+jEKiHVEpRGPw== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(36860700016)(7416014)(376014)(1800799024)(23010399003)(11063799006)(5023799004)(56012099006)(3023799007)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Q7cSolHICag/Be2nYGdU4Vqs/qMbhgeB+lP/TwHb5DFvc+DN5UZKO7IAuhwQaDjPEQRK1vjPcV2hhS9fCDkwNGiImAjRU7hMyamns93DCzA0EgpEQdHyvMIqFvCNkdLV5lLgPoZSi4+iZ94MpnGwZbwqnkmqokJ/NuEUiU9i1xx0BTwDW+9wG4/I2T6aTA/3vghLdPaI8Qt0IGp1bGHX4vJ91PG3MdmCYqAmr+lZInoiuitVcGomGr72n3MC1fJwe7HShPghyJBvukWyUHEFQcAvefju0w9wM7lAeVrJOeVjq83w9Y/8A/CwFk6EO7tbxJSoqmIPl7fbQm22GQBn3MQic7q6eSw2Wy6vud48iZVWg/aYsyzSTJdzt6kt4JTpli80VUdwDJ4UwzP4xpwW87O+Rl0itbbp5fZFoIiyWudtRj+iyCkePL7KZm1RhA5p X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:51:28.7727 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4f9ff126-7090-4a33-df3f-08df1234fc40 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018546.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB6045 Content-Type: text/plain; charset="utf-8" RM RPC notifications and GMC messages share the GSP-to-CPU queue. GMC waits and the threaded queue drain need to recognize both formats while preserving RM RPC notification handling. Validate the common framing before selecting the message format, dispatch interleaved RM RPC messages, and use the same receive path when draining the queue. Co-developed-by: Alok Kumar Signed-off-by: Alok Kumar Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp/cmdq.rs | 122 ++++++++++++++++---------- drivers/gpu/nova-core/gsp/commands.rs | 8 +- drivers/gpu/nova-core/gsp/fw.rs | 9 ++ 3 files changed, 89 insertions(+), 50 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 942f41b4d705..b7d8a467d2fe 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -602,8 +602,8 @@ pub(crate) fn send_command_no_wait(&self, command: M= ) -> Result self.inner.lock().send_command(command).map(|_| ()) } =20 - /// Receives one GMC element from the GSP and passes its command id, t= he `max_resp_or_status` - /// field, and the raw payload slices to `handler`. + /// Receives one GMC element from the GSP and passes its header and ra= w payload slices to + /// `handler`. /// /// This method may sleep while waiting. The [`CmdqInner`] mutex stays= locked across the wait /// and across the `handler` call, so `handler` must not call back int= o this [`Cmdq`]. @@ -900,6 +900,10 @@ fn wait_for_msg(&self, timeout: Delta) -> Result> { ))); } =20 + if !header.is_rm_rpc() { + return Err(self.poison(fmt!("invalid RM RPC NVDM type"))); + } + dev_dbg!( &self.dev, "GSP RPC: receive: seq# {}, function=3D{:?}, length=3D0x{:x}\n= ", @@ -938,6 +942,24 @@ fn wait_for_msg(&self, timeout: Delta) -> Result> { }) } =20 + /// Consumes and dispatches the RM RPC element currently at the queue = head. + fn consume_and_dispatch_rpc(&mut self) -> Result { + let (function, seq, length) =3D { + let message =3D self.wait_for_msg(Delta::ZERO)?; + + ( + message.header.function(), + message.header.sequence(), + message.header.length(), + ) + }; + + let pages =3D u32::try_from(length.div_ceil(GSP_PAGE_SIZE))?; + DmaGspMem::advance_cpu_read_ptr_v2(self.bar, pages); + self.log_event(function, seq); + Ok(()) + } + /// Receive a message from the GSP. /// /// The expected message type is specified using the `M` generic param= eter. A message whose @@ -1087,27 +1109,21 @@ fn log_event(&self, function: Result, seq: u32) { /// Drains all messages currently pending in the GSP-to-CPU queue. /// /// Reads whatever the GSP has already posted and stops once the queue= is empty. No caller is - /// waiting for a reply during a drain, so every message goes to [`Sel= f::log_event`]. + /// waiting for a reply during a drain, so RM RPC messages go to [`Sel= f::log_event`] and GMC + /// messages are consumed without dispatch. /// /// # Errors /// /// Returns the receive error that stopped the drain, in particular th= e `EIO` of a queue - /// poisoned by corrupt framing (see [`Self::wait_for_msg`]). + /// poisoned by corrupt framing (see [`Self::receive_gmc_and_dispatch`= ]). fn drain(&mut self) -> Result { while !self.gsp_mem.driver_read_area_v2(self.bar).0.is_empty() { - // A message is available, so this returns without waiting. - let msg =3D self.wait_for_msg(Delta::ZERO)?; - - let pages =3D - u32::try_from(msg.header.length().div_ceil(GSP_PAGE_SIZE))= .map_err(|_| { - dev_err!(&self.dev, "GSP drain: message length overflo= w\n"); - EIO - })?; - let function =3D msg.header.function(); - let seq =3D msg.header.sequence(); - - DmaGspMem::advance_cpu_read_ptr_v2(self.bar, pages); - self.log_event(function, seq); + match self.receive_gmc_and_dispatch::<()>(Delta::ZERO, |_, _, = _| { + (None, QueuePointers::Unchanged) + }) { + Ok(_) | Err(ERANGE) =3D> {} + Err(error) =3D> return Err(error), + } } =20 Ok(()) @@ -1145,7 +1161,14 @@ fn wait_for_gmc_msg(&self, timeout: Delta) -> Result= > { return Err(EIO); }; =20 - if let Err(e) =3D header.validate_framing() { + let framing =3D header.validate_common_framing().and_then(|()| { + if header.is_gmc_api() { + header.validate_framing() + } else { + Ok(()) + } + }); + if let Err(e) =3D framing { dev_err!( &self.dev, "GSP GMC: receive: bad MCTP framing, declared length {}\n", @@ -1182,29 +1205,34 @@ fn wait_for_gmc_msg(&self, timeout: Delta) -> Resul= t> { }) } =20 - /// Receive the next GMC event from the GSP and dispatch it through a = handler. + /// Receive the next GMC element from the GSP and dispatch it through = a handler. /// - /// The handler receives the GMC command id, the raw payload slices th= at follow the - /// [`super::fw::GmcApiHeader`] (two because the ring may wrap), and t= hat header's + /// The handler receives the message header and the raw payload slices= that follow the + /// [`super::fw::GmcApiHeader`] (two because the ring may wrap). The h= eader contains the /// `max_resp_or_status` field, which only a handler that knows what i= t asked for can read. /// It returns `None` for an element it does not handle, paired with t= he [`QueuePointers`] /// state it left behind. /// - /// Returns `Ok(None)` when nothing claimed the element, either becaus= e it is not a GMC - /// element or because the handler declined it. Either way the element= is consumed: the read - /// pointer moves past it, or is written back past it when the handler= reset the GSP. + /// Returns `Ok(None)` when the handler declines a GMC element. A vali= d interleaved RM RPC + /// element is consumed and dispatched before this method returns `ERA= NGE`. The read + /// pointer moves past the element, or is written back past it when th= e handler reset the GSP. /// /// # Errors /// /// - `ETIMEDOUT` if `timeout` has elapsed before any message becomes = available. /// - `EIO` if the queue is poisoned or the element fails framing vali= dation (see /// [`Self::wait_for_gmc_msg`]). + /// - `ERANGE` if a valid interleaved RM RPC element was consumed and = dispatched. fn receive_gmc_and_dispatch( &mut self, timeout: Delta, handler: impl FnOnce(&GspGmcMsgElement, &[u8], &[u8]) -> (Option, QueuePointers), ) -> Result> { let message =3D self.wait_for_gmc_msg(timeout)?; + if !message.header.is_gmc_api() { + self.consume_and_dispatch_rpc()?; + return Err(ERANGE); + } let header =3D message.header; let length =3D header.length(); =20 @@ -1213,32 +1241,30 @@ fn receive_gmc_and_dispatch( let cpu_write_ptr =3D DmaGspMem::cpu_write_ptr_v2(self.bar); let cpu_read_ptr =3D DmaGspMem::cpu_read_ptr_v2(self.bar); =20 - let (result, queue_pointers) =3D if !header.is_gmc_api() { - dev_warn!(&self.dev, "GSP GMC: dropping non-GMC queue element\= n"); - (None, QueuePointers::Unchanged) - } else if num::u32_as_usize(header.gmc.size) !=3D header.payload_l= ength() { - // GSP-RM sends the element as the GMC header plus `size` byte= s, so the two lengths - // describe the same payload and a handler cannot tell which o= ne to believe. - dev_err!( - &self.dev, - "GSP GMC: payload is {} bytes, transport declares {}\n", - header.gmc.size, - header.payload_length(), - ); - (None, QueuePointers::Unchanged) - } else { - let command_id =3D header.gmc.command_id(); + let (result, queue_pointers) =3D + if num::u32_as_usize(header.gmc.size) !=3D header.payload_leng= th() { + // GSP-RM sends the element as the GMC header plus `size` = bytes, so the two lengths + // describe the same payload and a handler cannot tell whi= ch one to believe. + dev_err!( + &self.dev, + "GSP GMC: payload is {} bytes, transport declares {}\n= ", + header.gmc.size, + header.payload_length(), + ); + (None, QueuePointers::Unchanged) + } else { + let command_id =3D header.gmc.command_id(); =20 - dev_dbg!( - &self.dev, - "GSP GMC: event: seq# {}, command_id=3D0x{:x}, length=3D0x= {:x}\n", - header.gmc.sequence, - command_id, - length, - ); + dev_dbg!( + &self.dev, + "GSP GMC: event: seq# {}, command_id=3D0x{:x}, length= =3D0x{:x}\n", + header.gmc.sequence, + command_id, + length, + ); =20 - handler(header, message.contents.0, message.contents.1) - }; + handler(header, message.contents.0, message.contents.1) + }; =20 let pages =3D u32::try_from(length.div_ceil(GSP_PAGE_SIZE))?; =20 diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index c2faa825a849..7ca5ec2a58d9 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -209,7 +209,7 @@ pub(crate) fn gsp_init( cmdq.send_gmc_no_wait(GMCAPI_CMD_GSP_INIT, payload, GSP_INIT_MAX_R= ESPONSE_SIZE)?; =20 loop { - let reply =3D cmdq.receive_gmc_and_dispatch( + let reply =3D match cmdq.receive_gmc_and_dispatch( Cmdq::RECEIVE_TIMEOUT, |header, payload_0, payload_1| { if header.is_response_to(GMCAPI_CMD_GSP_INIT, sequence) { @@ -231,7 +231,11 @@ pub(crate) fn gsp_init( } } }, - )?; + ) { + Ok(reply) =3D> reply, + Err(ERANGE) =3D> continue, + Err(error) =3D> return Err(error), + }; =20 if let Some(reply) =3D reply { return reply; diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index 309f9296ebc8..0fccf16f6a1c 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -527,6 +527,11 @@ pub(crate) fn validate_framing(&self) -> Result { self.transport.validate(size_of::()) } =20 + /// Returns `true` if the NVDM header routes this element to the RM RP= C dispatcher. + pub(super) fn is_rm_rpc(&self) -> bool { + self.transport.is_nvdm_type(NvdmType::RmRpc) + } + // Returns the sequence number of the message. pub(crate) fn sequence(&self) -> u32 { self.rpc.sequence @@ -811,6 +816,10 @@ pub(crate) fn validate_framing(&self) -> Result { self.transport.validate(size_of::()) } =20 + pub(super) fn validate_common_framing(&self) -> Result { + self.transport.validate(size_of::()) + } + /// Returns `true` if the NVDM type says a GMC header follows the tran= sport header. /// /// When it returns `false`, `gmc` holds whatever header the other ele= ment kind puts there. From nobody Fri Sep 25 10:37:46 2026 Received: from BN8PR05CU002.outbound.protection.outlook.com (mail-eastus2azon11011045.outbound.protection.outlook.com [52.101.57.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BE1183E95B2 for ; Mon, 14 Sep 2026 07:51:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.57.45 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372307; cv=fail; b=JTRfHLgvELuG9LzpSLh3rzHC93bTpeBt+mVBV2NV+7+aFRcp3x++MEkqDX/f00MuSLeo8wv+oV0iDgT0hmzrRx/kFdqPnlZ5jxNGUoy1gBFj0nW0QFQ0ymd7pLALXiHwj3orjGOIwmJnFVpYvEm6hk/pgE/KGTSHbbfBRg3Bbr4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372307; c=relaxed/simple; bh=T8HMaccVWvzfu7FziJTjaf9RL4q7pNTOlAvTXdbOV9g=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=puyPspcYJxXz/W/6Xq3YeiPOHOIuKWbAWxnm8jrdQF3AIlKKWsw4ko2rXNLBLG2C9aKSn0KeLpe2bCy9RZz+iPztTMWqD2+ZZfvcU+iQDhF4+5WWJLolKGeIwjebxAzdio4IIZK9ZSlFQ03CkDrqVdAhWysByyYzw8bKveAAmqg= 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=HE1G+NSj; arc=fail smtp.client-ip=52.101.57.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="HE1G+NSj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kZvsrutLC7d2yyR6SGh8svDVhpRq9r/CTPBlFu2u93SMMWP2Wmj+G10ZVXsvSjIBPpX8AO4wEr5vqOM6KgsogxlVPir9I03IoamjEvQ3+GaB8tZ1SOtLxCHLTyHHfAJwAewuPxLQsjyCUT4grotvP06YTTHdDyaePCToV87sD8CkmLBp999ZqTYK8aTFpSptcxRQKrkffoau4eor0Dv/JvdpY8/RyU/HQtM7YdYHqrn3Zcd5V11hKEHH7zI6yvobWUOFZVm2A6I19LXFOSMAiAlM3oqNGyO1O2rx1tcCsOLb9W+lad2FcPY/oESAoPkq+rTwMWOAG6SdxOtdSIko2g== 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=+ffF4DUt18UWdgbl/Wqpdc3jOO9AczlWBxrVjN7LxAc=; b=bthOt1IY0XzLxM5o8CEtl2LMu5lKJZ3x6b4nld5EUBkChu+lI5yH7xIVywGeNPKaRJiY1c9QODKxmAcEd9csb76prFsmzR655UfcF5GxAbTXBuXIEdOUau7RnaeCod/Zyf3BPnVIOeiq02tV61Jsxsx6iH0tUGzWuvadLi7nJM9F+52qQziLII9s6JjUtH6XSfPzV1+EA/8zwtIB/JwEmkhIQJsrJAtke5yv2Pgn84fOcMAgV5UyNVqUvPWszVDKUy4UWhJnJzKQU3/o8SC7mRNSVvFF8wAaF22ouFT2lTIhg/9TB6SzO8lBlJfBW94TiayeTPrhPsMrOzxsTAlVlg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=+ffF4DUt18UWdgbl/Wqpdc3jOO9AczlWBxrVjN7LxAc=; b=HE1G+NSjf+j6WNXcvcbsffzdBeXr9JoPia+q0sPhRJrwqkfTqpxJ78zkYEWuWWJq2spd5gxdkc9jnNbwJ9EaLsxu3sboxqGf7oOtgbh6FhGqmpXQN5vZ7Ze3qlnfCyiFxKPWskJPtefiRZpL110fxV9moPGO2SCSOxbonqJXKEfzsP6jqViSd545C6EkkBmNdouJ7o/vQiIi5OQ+Jszn0f8RHtoXPR4Vef25HBmi4yvRnfZ5liao7WDJPCTwBfeuvR/SSbnuuLvVhO9QxbWtRj2ljj79ULz3PHO+FYnx80i5Zlk30McOvEJ3MUBH+nFa0eUX3KGYXGIN6SOsCJ18dg== Received: from YT4PR01CA0407.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:b01:108::21) by SA3PR12MB196577.namprd12.prod.outlook.com (2603:10b6:806:533::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:51:41 +0000 Received: from BN1PEPF00018548.namprd05.prod.outlook.com (2603:10b6:b01:108:cafe::97) by YT4PR01CA0407.outlook.office365.com (2603:10b6:b01:108::21) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:51:40 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018548.mail.protection.outlook.com (10.167.248.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:51:40 +0000 Received: from rnnvmail203.nvidia.com (10.129.68.9) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:18 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail203.nvidia.com (10.129.68.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:17 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:51:10 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 14/32] gpu: nova-core: gsp: add synchronous GMC transactions Date: Mon, 14 Sep 2026 10:48:49 +0300 Message-ID: <20260914074907.1399629-15-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018548:EE_|SA3PR12MB196577:EE_ X-MS-Office365-Filtering-Correlation-Id: 9bbced1a-8138-4426-4f08-08df12350324 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|23010399003|36860700016|30052699003|7416014|376014|10067099003|3023799007|22082099003|18002099003|56012099006|5023799004|11063799006; X-Microsoft-Antispam-Message-Info: WYmjBZn03207IB0FcY3gS5KuVpBMtkkFHxeDouUGw00iakBJJcNk9vCurx74ZKc18qztfJT+c1XcH3FlJCB9ivpEAGQbo7PZp6hbsCIWP0CKQZLB2XXqtCqw/UcwO2M2YKNpbNS7eWNFqAbYKoSW49+0TwQVwVQ6hRWbOevPPjZG2u2NVqfCAdf3kbbweocMkrDWyVLtfE6L09yEgL90+1tLrw7laHz09G+oPFBgz+GGtgcYbS9xBZr7wJ7QIephvmqiImdLJ962K9yMnzzz352d820WpJDNxl6kpqxjyGtxvPhVbZk8NEkhKjZoIQt7R+NwquIfVotmxTAkAqZyQONPl/wLvv1ekkqV/Xpfc5nZ104cjo+mva9CUhkzyJTl2Ake/W1rGBx9aCFMfACZNIVS0AltN4X2mNuUrfziDDUz4JbVi2IRkAVp0+1AY316zgBFNsc9blSyOTgmsRZvPXEypN3k/pSvcPJtHPIa2iybuN+ygmGwCwJ1S4F0chrsoy5K3A4lhhE9IztogCAj625x09XAX38/VuBboMhFPx7SuBo1shlTbby/PJyHQfcyhuJDkXBmaiqmbd9WbLvqj/dt29fUEcJxmt5v4v9OQJcFfJN/wFf+UUVLvqZ6oDUIOj6mO/KylHQVVEMyrCA/cj1Nb6Nm7Lsof2D1nfgJ8J54OHZPTuTATV5RfrpsLd/whoVttYlwMQFCqou6g1ZZOw== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(23010399003)(36860700016)(30052699003)(7416014)(376014)(10067099003)(3023799007)(22082099003)(18002099003)(56012099006)(5023799004)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: dXcQ+Hfy370d6gZ/dX5xehtnqHARCkp6atz6UDO6ISBttulCinobHu4KPOufoPC6Bz2w5s2xEn1OGCEgDxHTejYU/JtlVSsx1ICbxvSeoDyQQMILrr36l7MwHi2jKpgikYDpd/xGbXPw/9brN6D0/DGDXGBvTvHrUe2QYccEp+vjflODFGLMXggIMdG1NHBAEphV+Y8dmo5glHKc249lLfCWr9KZRk5SYGiQAhIKhzjpbdD9c6jJvzsOCjY1Kbj0zNk1iKPm6K+kDI8FZBTQkx4r3Z/8/J5lt35O3htsLeSL/GG9MWKupJnjJE0sQqRv0kwo8fov7CPd/O1RqDUt5e+xsbdYNdp696kJtr3QGtDLg1B+V2GKbfEO8kQfF6mKyxxlhOsh9Zk7K5vflgFecn1U0UiE9pEw+oPz99ZW/WWLhjehPeIsxkdDcKbeIll3 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:51:40.3401 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9bbced1a-8138-4426-4f08-08df12350324 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018548.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA3PR12MB196577 Content-Type: text/plain; charset="utf-8" vGPU management queries return data that callers decode after the receive queue slot is released. The request and response must also remain within one transaction so another receiver cannot consume the reply. Hold the queue lock across send and receive, match the response flag, command ID and sequence, and return the status with an owned payload. Support default and caller-selected response timeouts. Co-developed-by: Alok Kumar Signed-off-by: Alok Kumar Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp/cmdq.rs | 98 +++++++++++++++++++++++++++++++ drivers/gpu/nova-core/gsp/fw.rs | 8 ++- 2 files changed, 103 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index b7d8a467d2fe..9fb17e576eb8 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -500,6 +500,16 @@ pub(crate) enum QueuePointers { Reset, } =20 +/// Response from a GMC API command. +pub(crate) struct GmcResponse { + /// Response status (`NV_STATUS` code). Zero means success. + #[expect(dead_code)] + pub(crate) status: u32, + /// Response payload copied out of the message queue. + #[expect(dead_code)] + pub(crate) payload: KVec, +} + /// GSP command queue. /// /// Provides the ability to send commands and receive messages from the GS= P using a shared memory @@ -638,6 +648,94 @@ pub(crate) fn send_gmc_no_wait( .send_gmc(command_id, payload, max_response_size) } =20 + /// Sends a GMC API command and waits for its matching response. + /// + /// The queue stays locked for the complete transaction. A single dead= line bounds all queue + /// elements observed while waiting. + #[expect(dead_code)] + pub(crate) fn send_gmc_and_receive( + &self, + command_id: u32, + payload: &[u8], + max_response_size: u32, + ) -> Result { + self.send_gmc_and_receive_timeout( + command_id, + payload, + max_response_size, + Self::RECEIVE_TIMEOUT, + ) + } + + /// Sends a GMC API command and waits up to `timeout` for its matching= response. + pub(crate) fn send_gmc_and_receive_timeout( + &self, + command_id: u32, + payload: &[u8], + max_response_size: u32, + timeout: Delta, + ) -> Result { + let mut inner =3D self.inner.lock(); + let expected_sequence =3D inner.send_gmc(command_id, payload, max_= response_size)?; + let dev =3D inner.dev; + + let deadline =3D Instant::::now() + timeout; + loop { + let remaining =3D deadline - Instant::::now(); + if remaining.is_negative() { + return Err(ETIMEDOUT); + } + + let response =3D + match inner.receive_gmc_and_dispatch(remaining, |header, p= ayload_0, payload_1| { + let header =3D &header.gmc; + if !header.is_response_to(command_id, expected_sequenc= e) { + let kind =3D if header.is_response() { + "response" + } else { + "event" + }; + dev_dbg!( + dev, + "GSP GMC: skip {} seq {} cmd {:#x}; want respo= nse seq {} cmd {:#x}\n", + kind, + header.sequence, + header.command_id(), + expected_sequence, + command_id, + ); + return (None, QueuePointers::Unchanged); + } + + let response: Result =3D (|| { + let mut payload =3D KVec::with_capacity( + payload_0 + .len() + .checked_add(payload_1.len()) + .ok_or(EOVERFLOW)?, + GFP_KERNEL, + )?; + payload.extend_from_slice(payload_0, GFP_KERNEL)?; + payload.extend_from_slice(payload_1, GFP_KERNEL)?; + Ok(GmcResponse { + status: header.max_resp_or_status, + payload, + }) + })(); + + (Some(response), QueuePointers::Unchanged) + }) { + Ok(response) =3D> response, + Err(ERANGE) =3D> continue, + Err(error) =3D> return Err(error), + }; + + if let Some(response) =3D response { + return response; + } + } + } + /// Waits for an unsolicited GSP event of type `M`, consuming any othe= r event that arrives /// first. /// diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index 0fccf16f6a1c..ac94fb564bfd 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -739,13 +739,15 @@ pub(crate) fn command_id(&self) -> u32 { } =20 /// Returns `true` if GSP-RM sent this header as a response rather tha= n an event. - fn is_response(&self) -> bool { + pub(super) fn is_response(&self) -> bool { self.command & GMCAPI_COMMAND_FLAGS_RESPONSE !=3D 0 } =20 /// Returns `true` if this header answers the request that sent `comma= nd_id` under `sequence`. - fn is_response_to(&self, command_id: u32, sequence: u64) -> bool { - self.is_response() && self.command_id() =3D=3D command_id && self.= sequence =3D=3D sequence + pub(super) fn is_response_to(&self, command_id: u32, sequence: u64) ->= bool { + self.is_response() + && self.command_id() =3D=3D (command_id & GMCAPI_COMMAND_ID_MA= SK) + && self.sequence =3D=3D sequence } } From nobody Fri Sep 25 10:37:46 2026 Received: from CH1PR05CU001.outbound.protection.outlook.com (mail-northcentralusazon11010016.outbound.protection.outlook.com [52.101.193.16]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B0A7B3F1050 for ; Mon, 14 Sep 2026 07:51:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.193.16 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372315; cv=fail; b=CW6dhAXjmr1Ho06mFhvpv7qMur9ttoEVwR6ZJSvfSBXmNbwTlAIs3//cIpAPK6SFIs4q9KuUZyA7iXjOtjB9S6/GduJT1NeIFikuv+Zpv9qcJWTYEImaae67CVKTKIusQiHNLKUpQG+UBYrAFpSJsTwfYxvHlrbgJnPUVdwiKF0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372315; c=relaxed/simple; bh=B5jUQdwwZdwBfdNeTd04DFccoLDMOmnW8CF34bM0Jto=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=S5l2S0BHQOhCklO6c+ozvyZLdKvHh+2lloC/cQwpKtCwgOgYcuj2ASQ1Da+YJlQJ4X8QiCTcql2wesn3zrDOK1ofNGuEgZVxL+ODqALHj5hvGxwt2OOUaJBa2FXmDzK9InFoxDUcfhk1gUp5guqaJlcq79RsspJSj0whMaw6K6k= 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=WLdqy4Hb; arc=fail smtp.client-ip=52.101.193.16 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="WLdqy4Hb" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kTYMOTiUgc29olWoleKTHPFhxiPtFtJG06DP3pS6ct6jDlSc+iriemzA9xjJ6ixt1TpxFtLB14iSP24+5CwStHjIsOIVCWUvHy0EwbsGs0uWCpNiKIHvorOaDIUwEvEwErm3jhvJpUx7dBIR+WWR9rNGea4YgAQJ5TLSizBNJFK0a4LaegZnMRvjh2euezijOVGsyQg2scPaSRsJ3GeQKRU+KNnjYlc39Wv1nWdz5vsBiROsuDTJWppcnDyNaxWGjcSxHcWHTLr6n7E91UbtIyyvfGEjjqMEn5sGuI3ay2Xazi83tSRyEXHwf82aCTm3kPaFHn+YAFUKoV4yjrt8rg== 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=MOOferCbyywN11EFSmliw7Z4NRIMnNsPDTzVMlNmreM=; b=rWC6iiVOIAO/nxiIVWHZhHafehW7l1+ehqQsSB3s5RZIk/Guz6evGmH6R6WsjCwdtC6bdiFAaGcADkIjef1hz/vpgjQ9IB41++0CvMHM0qrFIdWl1szKSAy2wThvrk8b7MPW/+Aa+c0vvZL/YHfNZBzcDWS4dJE036eyWfsa4jg52eI6nzm+FzI+3UPL9G0KWU2MQy3qnnYjrF51TeC7AabkBmUhir1EKSC7VnBCqedjJaM/RTmKA98j8InlB5iBvSUNUjkECRdVR+rfYO3+rhILnnPCHnzwOwZB3s0F4yahMMl120/fmBcAbibuRJPPmCF2ZgfBaqzCaiGqSPVjew== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=MOOferCbyywN11EFSmliw7Z4NRIMnNsPDTzVMlNmreM=; b=WLdqy4HbczcwF2B1lCkVaPneMS09eUDXQNy+i1DQW8Y9IDjxFOnC6T8sGeudVy2m+nrSWgpgEmya0vk/dmWxmnogRX3erk59PITiYSTYAkxhCLPsnfIFmnIYJXbuve8YwCi6P+dUW6pO0C/jsCLLr1w2fl2xCVtEzeOFrqe4w7CK3DbLqFzBR0TA7IV4lRkUJc8c5+CHQYNFaQfjuaQipnytGvCBRNLNAIn6IOvUAPUkjb4E+C/lEBnlZIH+fIn8Wz/3Y5Npt2M0KaC9fmItl+i+6gdY0UNbuveCbmIGR46boD1CaOVT49BzVIkMH3rkPyY7YY5P0qRDwqHd16HQ3w== Received: from BN9PR03CA0356.namprd03.prod.outlook.com (2603:10b6:408:f6::31) by DS7PR12MB8250.namprd12.prod.outlook.com (2603:10b6:8:db::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.9; Mon, 14 Sep 2026 07:51:46 +0000 Received: from BN2PEPF0000A893.namprd04.prod.outlook.com (2603:10b6:408:f6:cafe::29) by BN9PR03CA0356.outlook.office365.com (2603:10b6:408:f6::31) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:51:46 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF0000A893.mail.protection.outlook.com (10.167.248.185) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:51:46 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:51:26 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:26 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:51:18 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 15/32] gpu: nova-core: gsp: add status-only GMC transactions Date: Mon, 14 Sep 2026 10:48:50 +0300 Message-ID: <20260914074907.1399629-16-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000A893:EE_|DS7PR12MB8250:EE_ X-MS-Office365-Filtering-Correlation-Id: f5846086-ddcc-455b-7ca9-08df123506c8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|376014|7416014|82310400026|1800799024|36860700016|23010399003|18002099003|22082099003|5023799004|56012099006|11063799006|10067099003; X-Microsoft-Antispam-Message-Info: SrcSdMt4RrerJ2T3zXT2hy4E5CmBfrVA9Ryxkw4Vsss4pwohKRmwGQDaVW12a7pZ6Nbu4HmCafS3jhEXv+rUfx7Rzq0fbu2PbMVfMRIJKIyFw3wNbseO2LOq9MhHkHtksvN4KwJZPWgjlIUkfeodH+W80pHKXl0LuqpY548qGPGWvpAbSwZz94dPmkD0LmUxk7JjWSkZaGYdzQHv36eCYvdZmkB8MfW8ttEcYOm+ad6k58Yve3hh1kKJYzDGKebWnE9+fMiY2PpdlJ8geDHff8lznuAcLvnMae0dMbrLXMqdZnfFvQz/kNPy4Wi6th6MZiUhU5R4/7bGu21Rg2G2ZMXC6+tR8Hhhoynj2nKD/j3YOQAro2QfzgHEmCktKUq7s1CrxpKo2THnPcW3Tmx636NEWWMqSkCIEnOUXvnALO/6g5p0ThjLDcRe73ieGayFzeS3ew5FZXKoB9fhs03zRS0yApzIMV3Y3OK+4S3iNBTtBbN/poyUBUil/j56rOHSDYeRuEXvwWqtLs8CVNbFxr2LOVLzbODKt48R6nWSiP/SGo++BByiNE94Wl2Ku39uC5ex7P7m36tQ/9skNoZypZY0fAGQpKEnILpDkzig7TtRuc9xW5KZzTPzl669jvc07AFUY1ncNp0DoLPvr1HAgZiThQ+qG9JepOhiXjLml6Bbt+2RLP3HJkq5jIv5GRoGiQJJ+hk/SWM5Z7ro2BmBtg== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(376014)(7416014)(82310400026)(1800799024)(36860700016)(23010399003)(18002099003)(22082099003)(5023799004)(56012099006)(11063799006)(10067099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ccMJnziBzPcw139K1fgWk0GZrRkUWDsBOvMed6FHrvi0LC9tF9XLSZr1YJMlI9Bk+YlrLPFbHpe2QtskhYMSSy7VEt1PCNsydftUHhXVvC5/2PcK2AUB7QlP7aBBmmrRbLop5oKV2u6hAWYkvgIWsP6Sq1OirhHN/nAZcwedBr1ozbrzwcdB49RRFk8EtWrwYrXD0+L1Y5Z+qAODPqbZTuJg4Oxgq1jgzrDQ1LDBHcp4tRXuoKGxJD5ilwS5AKwXxSu/8LWSMX188aJgztMLvZDlaZ3Gf/X2C9SC8snyadVMn2UCm4OVMMpm01TiUagN9Dt6/ULVqDhe9xGc4O6PmSHB0eQ4tMOWBeP/ihqnOt8DbZubOxKugTpKoJLb2kBeTXicxdLRpJqJWRjamliF4VIQvBtqZZzITXn8fkmW01rh1KOK/SPhm39zCembxWmx X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:51:46.4475 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: f5846086-ddcc-455b-7ca9-08df123506c8 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000A893.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS7PR12MB8250 Content-Type: text/plain; charset="utf-8" GMC operations such as GSP plugin resource cleanup have no response payload, but still report success or failure in the response header. Add a helper that waits for the matching response with a zero payload limit and converts a nonzero firmware status to EIO. Co-developed-by: Alok Kumar Signed-off-by: Alok Kumar Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp/cmdq.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 9fb17e576eb8..891dec5c108a 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -503,7 +503,6 @@ pub(crate) enum QueuePointers { /// Response from a GMC API command. pub(crate) struct GmcResponse { /// Response status (`NV_STATUS` code). Zero means success. - #[expect(dead_code)] pub(crate) status: u32, /// Response payload copied out of the message queue. #[expect(dead_code)] @@ -652,7 +651,6 @@ pub(crate) fn send_gmc_no_wait( /// /// The queue stays locked for the complete transaction. A single dead= line bounds all queue /// elements observed while waiting. - #[expect(dead_code)] pub(crate) fn send_gmc_and_receive( &self, command_id: u32, @@ -736,6 +734,17 @@ pub(crate) fn send_gmc_and_receive_timeout( } } =20 + /// Sends a synchronous GMC command and checks its status-only reply. + #[expect(dead_code)] + pub(crate) fn send_gmc_and_check_status(&self, command_id: u32, payloa= d: &[u8]) -> Result { + let response =3D self.send_gmc_and_receive(command_id, payload, 0)= ?; + if response.status =3D=3D 0 { + Ok(()) + } else { + Err(EIO) + } + } + /// Waits for an unsolicited GSP event of type `M`, consuming any othe= r event that arrives /// first. /// From nobody Fri Sep 25 10:37:46 2026 Received: from CH5PR02CU005.outbound.protection.outlook.com (mail-northcentralusazon11012018.outbound.protection.outlook.com [40.107.200.18]) (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 55CF73E95B1 for ; Mon, 14 Sep 2026 07:52:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.200.18 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372323; cv=fail; b=UPkZUaXlz0P9HUho0QlRsKnXYvWqBvybP0Khqw4plby44+6zD1mJFe8iUhQo2BB2nyMWqPHd8oH9JdhvBc/vQ4sNxvJkaooGk39Qy7oVZty8ZOFfFfQxJHJpdjbgbFRR71bSh1TU8H9mSBmpOVvbfogzgvVTFItQUNBI32G+E0c= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372323; c=relaxed/simple; bh=Y7FeIw9o7gBU6x3fc7mvniCbdvBp+y/F9OD5T/xsT7s=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=uALm2DLc3PwPP6pSIcvC7kp9ysXWcp8ZXRFv6Sbf8MSyC2v1pFGs51qZn/LaQnKlIY6riPXOc/RXqYdOThRNYtPNeL4iBrIymXqm7YI2+8tInMxhkOVmuIg++Nm/va8xDHzOWCNTdISj1oCRV6lIbhW9t3HGQnvH+w7HZURI4rk= 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=cyA0ZiLN; arc=fail smtp.client-ip=40.107.200.18 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="cyA0ZiLN" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=xhAFJbWD4KVNaKfBnkEcIhGEOzTJxEhFVOf8vVd6J3mL8KzSAh7H13SlMzzL+RIxQlTgG0DUIYD843KpWB6Sk/7S+PsqTt59ubCDCHB7t3IjoTLAVO7h7wNg0Zv6Dgzmnnbo0qXFLjvGBWd+nI2gLsz179bi86dUsViMf9V+Uok6mgUfE/nsdDEIb3chzBoi7rAyLrVOicQgkWIwaSJs5zcWg4VKynRvn17XUWX9w6FxMVt8hIfybNGynPNwSjJYdlfxagUhKTpWiyT1gDSCkrFztKNXyANX1fJ05gnOkAu1KZDYYhkQrmr2LYMQA/UUxPpyP8xwS4WZ6OFJLvPm8Q== 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=gJTv6hLBephCThZU77UsAid3LOEPwk5LHzSV4ikACfs=; b=jdOjCzXy+Fde6rTUG4uaa2H+RIXdqEfhd4w0rSt4hRszPGJwjEZJT0WfLbJu9DzCE2lSvDCy51fKT6sb8ZrEkESkfkCgnoFrZmTB5ydXz9tlZt1jNdS47u9cF54mDdbYwVKMnCwBDIvLqhfsacsEo//K3ohiEU3aVFxdBywpCj8Xx3j31x25XBLoQYeD0fwjWFUNEBPVswi0WeqcACN9FQwZBiRi4+4D1Xrc2Wf/mPzvqXBhMi2+3kNHBN8qqoG8e3VZE4d+/D6lk+rGGcpVwmSjUmmmLIG1gC2z+3sunLbZAJ01jl34JDZbE0/8BhGwLiXD+iykRTiV8Gcg6vc5PQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=gJTv6hLBephCThZU77UsAid3LOEPwk5LHzSV4ikACfs=; b=cyA0ZiLN+xCENvc4uM47bIGezdHJJXfLQz3T13kTv/VAdCO+nGvebQaUYkt/bPOMK7v0yQLfu+luD5aTOy4QxN1NdcQkAkKtqbIieJnu2W3gnRQk7W3BwQKapmsrMdd2DkxO4ZLfeWXtrY4ElcG7BfvuDkSqrespVqkFyW/PicPAt03tymYM6C9zUiB3ej/YI0/7+UseL5hLRJ1OIYL7qhfBLHa+KBKYQ42jcDakqqX5xoT8vicq1SU+I0pcCBxtmOnLEHM3MNuJYKl/1x20zd2feiMuns0uyKA3BvYpUSk1ALfp1AY+xkUIZIfogff3Gn1Zm9Cw39IeYtiz+ixkdg== Received: from BN9PR03CA0880.namprd03.prod.outlook.com (2603:10b6:408:13c::15) by DS0PR12MB8019.namprd12.prod.outlook.com (2603:10b6:8:14e::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:51:53 +0000 Received: from BN1PEPF00018549.namprd05.prod.outlook.com (2603:10b6:408:13c:cafe::7f) by BN9PR03CA0880.outlook.office365.com (2603:10b6:408:13c::15) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:51:53 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018549.mail.protection.outlook.com (10.167.248.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:51:52 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:35 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:34 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:51:26 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 16/32] gpu: nova-core: gsp: wait for GMC completion events Date: Mon, 14 Sep 2026 10:48:51 +0300 Message-ID: <20260914074907.1399629-17-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018549:EE_|DS0PR12MB8019:EE_ X-MS-Office365-Filtering-Correlation-Id: 48c065e2-8102-4e0a-fc10-08df12350a94 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|30052699003|7416014|376014|23010399003|1800799024|82310400026|11063799006|56012099006|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: v4ldZbDIX2t6/ycW5JxoYqRULxHvuuverAWH1MN0+GXTBaPwPPep9Xk+aMr6oFmvcjM9fWKFxNBqTn403jqaB3smBG6QKLxCjRW3H44fvCGBwgC6fgJCbJtD1BDhZAYIsl7J/nfc7EfqXVOtdpbXic0pc26FWvqnYz3mgQJtAi+WMOrH5uvwCvldyzjdzUUAfnZInS+hgcjIJpUF1up/oAmlG5JiWF+GHkKZlJnBK9RtGSIpS5C1DQDpOs7s+u0KIITdvQC24lKrc9w55k6G9vHAOmW/JB070PkrQHcdghb/IF3XullSSRIvgjjBr0ixxs2os8L2vnWfcLOJfrFxpAW22Pct6kD8iJIH9jutSfWyR+AzDoZmT4NbuLnlJ/mFj/4VvubzYK3w17iEqDjhpG87+ViIlyBhQAgBqnkPpquLwxR0fCqY7vm7nv+IN/npJ/TW04qPFYjIhfBIvkqU2X8XGp3NjT8aUpAT6aoZo5TzOuKgD5GcRhyH4Ogh346TdSmjsdd17gvFwWZ661QsXhJxllGttjIgXxXEgZZW1HmHjLpQ3SKxq3wSg2eztiL5M6vBQcFZjIDz4Vb0FKqEPAkC1i1Gro48Yb7qQ1Heo4W9RK3Z88RLNpuZ4XX7o6cuJ+T2k1FPrYBkUw7vb42HjeM9WdcCmaar0Ya20gs7bNVTGuCtRdsOkXtnNoW6X6SBAiGGfmpX52V/5KR+D61P6A== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(36860700016)(30052699003)(7416014)(376014)(23010399003)(1800799024)(82310400026)(11063799006)(56012099006)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 9FL7wWvTxCWziFkOWhn8hecdzn7WjT36CLVrzHWPbChpxGCaZaw4t7A8oh9NoT+ttZp/l8zss28KGTno6J2ESBknrDRLZAJ882KMoX2lsdzuRxW673jTdJ6rdTvE/ljbQgzcYWF0dgFqioTx4bCIF3ZSvo543zxp+wbhl2JUVe5RDtTEP3kbWaq6KZGjF7hc+k/ysslHbT7cJT5kX9AVddW90lXUfmnBal1j5+bplxpJtZJmwjsm9zeZuD6OZo3OR/n3+0vHrTZhHmlU3ctjS1XdHgFEFKlsI9h6EtnVVgdGC2VcNKIAVZV9YXEHVdXfYshXAAng25LSGSGGZfRuOatS53aIGRu/mWoxr7VXoDGuk3DNhxM3MdhBGlQrj80H6cXPz9/BJkXYi3Rqv1GhzZKDeawQvVoX2FyIJkR2pPNHzF1ARIHU4nl1e5ONadzP X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:51:52.8029 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 48c065e2-8102-4e0a-fc10-08df12350a94 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018549.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB8019 Content-Type: text/plain; charset="utf-8" GSP plugin shutdown completes through a separate event carrying the GFID. Releasing the queue lock between sending and waiting allows another receiver to consume that completion. Hold the lock until the caller's predicate matches the completion event. Pass unmatched GMC events to the caller and keep one receive deadline while processing interleaved traffic. Co-developed-by: Alok Kumar Signed-off-by: Alok Kumar Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp/cmdq.rs | 61 +++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 891dec5c108a..137242ca0b11 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -745,6 +745,67 @@ pub(crate) fn send_gmc_and_check_status(&self, command= _id: u32, payload: &[u8]) } } =20 + /// Sends an asynchronous GMC command and waits atomically for its eve= nt. + /// + /// The command queue remains locked from the send through the matching + /// event, preventing another transaction from consuming its completio= n. + /// Interleaved GMC events are passed to `handler`; responses are cons= umed + /// while waiting. The receive deadline starts after sending. + /// + /// Both callbacks run with the queue locked and must not reenter this= queue or reset it. + /// Their second argument is the raw `max_resp_or_status` word of the = event header. + #[expect(dead_code)] + pub(crate) fn send_gmc_and_wait_event( + &self, + command_id: u32, + payload: &[u8], + timeout: Delta, + mut predicate: impl FnMut(u32, u32, u64, &[u8], &[u8]) -> Result, + mut handler: impl FnMut(u32, u32, u64, &[u8], &[u8]) -> Result, + ) -> Result { + let mut inner =3D self.inner.lock(); + inner.send_gmc(command_id, payload, 0)?; + let deadline =3D Instant::::now() + timeout; + + loop { + let remaining =3D deadline - Instant::::now(); + if remaining.is_negative() { + return Err(ETIMEDOUT); + } + + let matched =3D + match inner.receive_gmc_and_dispatch(remaining, |header, p= ayload_0, payload_1| { + let header =3D &header.gmc; + let result: Result =3D (|| { + if header.is_response() { + return Ok(false); + } + + let command =3D header.command_id(); + let max_resp_or_status =3D header.max_resp_or_stat= us; + let sequence =3D header.sequence; + if predicate(command, max_resp_or_status, sequence= , payload_0, payload_1)? { + return Ok(true); + } + + handler(command, max_resp_or_status, sequence, pay= load_0, payload_1)?; + Ok(false) + })(); + (Some(result), QueuePointers::Unchanged) + }) { + Ok(matched) =3D> matched, + Err(ERANGE) =3D> continue, + Err(error) =3D> return Err(error), + }; + + if let Some(matched) =3D matched { + if matched? { + return Ok(()); + } + } + } + } + /// Waits for an unsolicited GSP event of type `M`, consuming any othe= r event that arrives /// first. /// From nobody Fri Sep 25 10:37:46 2026 Received: from BL2PR02CU003.outbound.protection.outlook.com (mail-eastusazon11011051.outbound.protection.outlook.com [52.101.52.51]) (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 65A113F58E1 for ; Mon, 14 Sep 2026 07:52:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.52.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372330; cv=fail; b=Ld0t5+Q6IsXrJWXWri6vEm8x2538q30R94mq0+6G3ohRnUIuAIDTIA15D/lxmx+Cj9CpwFPpcSw1t9WU2xwV32nG0MElV+KkxqA4UTFMGXRJhDcb5ZqocZJDuqVF6slCmNR4urHPNxYRrdhI+4rzLjLxMWlB6eg24BrX0bPYIMI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372330; c=relaxed/simple; bh=aF2L/7TZRD620MqGYxi6nydePm24Jhhns/xELnDi2dU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=MzzT4Y08t5qmnk7UuG7tDSHHtcHEbexwtpFLCvjMe8vMBcz0ZAvbjY9Oc94VpXVAlJ7ERRqABoI4YSBTnuuVSwy8iNixSHMLfefcWf6Ms2TA6UdzZMuLJmiXrIBnh17FkINCvad6xQffgiXq+n1OxqbC5Y0nqR/wdW3+T5hdm9k= 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=JLI/kp5o; arc=fail smtp.client-ip=52.101.52.51 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="JLI/kp5o" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QCn3sPZ3cX+b1wdr4VY+SW+MCQG0DEww+ywD6hoqRXwXsjlB+jRzFVUImyAADWrL/D9XDU2e5newjeSLGKs1QIhc1JZZiTRi+kBEr8KzasY0Xhz/y4p8jQ5wx5iah2dBsj3uMYdMOiFMeK7uCfnfV7/1A8TmYyjaPbrYJJ4WT2k9IVyZ7BXdZr7um3fxv/Ovn22nZPZaUW3aQKM+4RUYzsi+Fh5iKKEw3kjGU9NDrGuY/6BV6I2vqtzzmQobSe9bVBTVe8HaR0fZ6YtLflTaD9z+r8W+4/vGQEtsKAcvnEJ/cR7GY9YqTiwAAvJmyH+oViUEqYZ8CQR88DNigxVtqw== 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=uK0janomBS4FDi2NSVODdZmbtMIEOcYHuBGwhyozNlA=; b=sGOM9cLYSBnxTOtUDX8SI6r9cBnO2aDCRd7KIZvivEHqWrC/qE7xKpHjzgE2qwVilgfJLvYfW2IEYOjDLwleS0qB0qfzqnwhaQA3F3kUN6FX9TYHKH8O5NMZzVGxXa5VCL2JtLCptuKdI/cgAgL1eOKdjQNo5ScCr5MJAWeiQNCpqMhODW+w0ytJSsoP/4VZ9fdumcppIRDfCPV3Hi/EOnwYKAEWIrLuzDP8nZD67LNZmBXj5KMuBUiOrzFiJnFaaSIsI5ya6tL+xCbsB6e0fGZ7mwqMHqfesVG6GrzA/m+0IGbvENZDHgGRM2Ax141GcYY9RF0dniBKzxCLSd7O6g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=uK0janomBS4FDi2NSVODdZmbtMIEOcYHuBGwhyozNlA=; b=JLI/kp5oRqJQgRdt9h0oWVCHR8R0DUIfOLlgnmoUNtG5bxINNyh/Ra5OE9Z1Xo9LIrkq/YRjd9SxTJ4KvelcvinP+R5aWSJkOoZhf+5A7LnmFP6h6scixMz6LqO44rTY2TrRChHph2tnpC1+qZVGwgL+CMtBTai0fytVXci7BRhN50oxjQeJ/YncrkXSCcW3zLKuriFs0HFntlQQO0TjLB3P94DXiXVkG74XhleBBVmXBqJc57QFRthMYvkBlmMiLfxMuz6RkPJOagxbyd5FJyulW4FP7FwRMPIU8divqXXFzXkZulLEGBz+o4X3D+QaloIK6Wg804x9esQa1HIQjA== Received: from BL1PR13CA0152.namprd13.prod.outlook.com (2603:10b6:208:2bd::7) by DS0PR12MB8766.namprd12.prod.outlook.com (2603:10b6:8:14e::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:52:01 +0000 Received: from BN2PEPF0000A88F.namprd04.prod.outlook.com (2603:10b6:208:2bd:cafe::a2) by BL1PR13CA0152.outlook.office365.com (2603:10b6:208:2bd::7) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.428.8 via Frontend Transport; Mon, 14 Sep 2026 07:52:01 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF0000A88F.mail.protection.outlook.com (10.167.248.181) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:52:01 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:51:43 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:42 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:51:34 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 17/32] gpu: nova-core: vgpu: add r000 plugin bindings Date: Mon, 14 Sep 2026 10:48:52 +0300 Message-ID: <20260914074907.1399629-18-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000A88F:EE_|DS0PR12MB8766:EE_ X-MS-Office365-Filtering-Correlation-Id: e7f3003e-e23e-41b5-50d6-08df12350f85 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|36860700016|23010399003|82310400026|7416014|376014|6133799003|10067099003|56012099006|11063799006|3023799007|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: TIlqzuJKOc2np2whxNqqKWE6JL3w1T2D4+9piCwmsPzGy/JW2zpWmoWtIAUUHarwn6pzp1z9zEZK4MY/B9B7WE+Db2M6Pq6DXFg8beXIcRGSH6blXWULQjI8e7K8mkj5s7zbdWjM7fgasa3MipGqRLxxDrFzMBMzbmTfelYuSutPYgF1d/5P6On/H3aklvDWafMadvZeGBoVDQqShJjrzAD7crBJ3VZKWs/XsOHZ2Fg3PI6vejqjzb7p3Hhy1wBdQhV4/Oqu7FXiaS14jaZhqAsczlzZhQ+SNY2qHaOYoFYUwDSy71Z6ACKxlKYnXYBQVDM1zwCTYanEyCFxl9W8ehe9g6L8rb/mXcmOQVxIXMm59Co6wXYBH2ASGTikWmulbPnhrfLQvH/Z28qvF/z20EvNf9vpqkPdmHJ+2S1RWZ5XN79TF8NWitodFpyNCDUzZi4QzhWeHzOkRga3rNbZPlcVmaDGyxr6oALW2cnik1oJTTA347fDVHDTOn4Eb5EEmQbT7jid2VVT7RaDM+ROI1t1aza0jt6tqsdfBIuowCOvncQixrwvPtacG7vVxqxE8P9as0quRc6iPqWxzli+gfuznugaflqfRpkr6Dc602ly6wOVaauG/C6/OK3OsJR4kp0nmX9BIyjCPsRNGuRd21FF4+9fHEnV++sL1Lvlu0TSV+uy3R5cxaFUCcqx56nvFJWjfS/28mVlH65YangYyQ== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(1800799024)(36860700016)(23010399003)(82310400026)(7416014)(376014)(6133799003)(10067099003)(56012099006)(11063799006)(3023799007)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: yxL8raFUKDWOoIYzJrO7vJVtsFTNNKHUo+SF6NVmrkKuszTeeSkCmsMDMXu1x0E85wWYPyABvXmlxSbvAEr1U5iL/vmPdMDYKdYfC9UrFVu85zad70O0mq7uvS4UbZ4TNc1KE0MGcRPI9n/uPTJd4C3JJBnbmgm0C4SVr4XzQXVyIMBvWxmWr+cJMrq+5orYpgG9OQmIkWaIRT7bW0Y3G7IMZ5yxa/hb6AmNsg7e9ea0sHaLjEGYJHbxIA+kAN5NV1fLtrRDcgDit8zel0OpksDjtVU3c6dN9c55rvvC9uxlkcsHR4V+ChxXxoJ4dmc5vWBaDmVRMof70B/TgDuVxwE39lymwUuZa+mkKSYDT6+7dQjPz2I+tA64LMZKcDkL7A7UMnldzcFgxog6e4qR4icWoUz8AI6F8cVaJM5wA2gWf1gG/wYHzopUjUzV6bXG X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:52:01.1034 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: e7f3003e-e23e-41b5-50d6-08df12350f85 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000A88F.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DS0PR12MB8766 Content-Type: text/plain; charset="utf-8" The GSP plugin communication area and RPC protocol are defined by the r000 firmware interface. Keeping local copies of that ABI risks letting the vGPU manager drift from the firmware layout. Extend the existing r000 binding set with the nova-core subset of dev_vgpu_gsp_shared.h. The bindings expose the control and response region types, message IDs, and firmware-defined region sizes. Keep the raw declarations private and expose only the symbols needed by the GSP plugin communication layer. Signed-off-by: Zhi Wang --- .../gpu/nova-core/gsp/fw/r000_00/bindings.rs | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) diff --git a/drivers/gpu/nova-core/gsp/fw/r000_00/bindings.rs b/drivers/gpu= /nova-core/gsp/fw/r000_00/bindings.rs index fa17d3e2edf6..3cc718bb2ab8 100644 --- a/drivers/gpu/nova-core/gsp/fw/r000_00/bindings.rs +++ b/drivers/gpu/nova-core/gsp/fw/r000_00/bindings.rs @@ -1,4 +1,5 @@ // SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. =20 #[repr(C)] #[derive(Default)] @@ -850,3 +851,175 @@ fn default() -> Self { } } } +pub const GSP_PLUGIN_BOOTLOADED: u32 =3D 1315261039; +pub const VGPU_CPU_GSP_CTRL_BUFF_VERSION: u32 =3D 2; +pub const VGPU_CPU_GSP_CTRL_BUFF_REGION_SIZE: u32 =3D 4096; +pub const VGPU_CPU_GSP_RESPONSE_BUFF_REGION_SIZE: u32 =3D 4096; +pub const VGPU_CPU_GSP_MESSAGE_BUFF_REGION_SIZE: u32 =3D 4096; +pub const VGPU_CPU_GSP_MIGRATION_BUFF_REGION_SIZE: u32 =3D 2097152; +pub const VGPU_CPU_GSP_ERROR_BUFF_REGION_SIZE: u32 =3D 4096; +pub const VGPU_CPU_GSP_INIT_TASK_LOG_BUFF_REGION_SIZE: u32 =3D 131072; +pub const VGPU_CPU_GSP_VGPU_TASK_LOG_BUFF_REGION_SIZE: u32 =3D 262144; +pub const VGPU_CPU_GSP_KERNEL_TASK_LOG_BUFF_REGION_SIZE: u32 =3D 65536; +pub const VGPU_CPU_GSP_GUEST_RPC_TRACE_BUFF_REGION_SIZE: u32 =3D 65536; +pub const VGPU_CPU_GSP_COMMUNICATION_BUFF_TOTAL_SIZE: u32 =3D 2637824; +pub type VGPU_CPU_GSP_BOOL =3D u32_; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone, MaybeZeroable)] +pub struct VGPU_CPU_GSP_VGX_VERSION { + pub major_number: u32_, + pub minor_number: u32_, +} +#[repr(C)] +#[derive(Debug, Copy, Clone, MaybeZeroable)] +pub struct VGPU_CPU_GSP_GUEST_INFO { + pub vgx_version: VGPU_CPU_GSP_VGX_VERSION, + pub guest_driver_version_buffer_length: u32_, + pub guest_version_buffer_length: u32_, + pub guest_title_buffer_length: u32_, + pub guest_changelist_number: u32_, + pub guest_driver_version_buffer: [ffi::c_char; 256usize], + pub guest_version_buffer: [ffi::c_char; 256usize], + pub guest_title_buffer: [ffi::c_char; 256usize], + pub guest_branch_buffer: [ffi::c_char; 256usize], +} +impl Default for VGPU_CPU_GSP_GUEST_INFO { + fn default() -> Self { + let mut s =3D ::core::mem::MaybeUninit::::uninit(); + unsafe { + ::core::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} +#[repr(C)] +#[derive(Copy, Clone, MaybeZeroable)] +pub union VGPU_CPU_GSP_CTRL_BUFF_REGION { + pub buf: [u8_; 4096usize], + pub __bindgen_anon_1: VGPU_CPU_GSP_CTRL_BUFF_REGION__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone, MaybeZeroable)] +pub struct VGPU_CPU_GSP_CTRL_BUFF_REGION__bindgen_ty_1 { + pub version: u32_, + pub message_type: u32_, + pub message_seq_num: u32_, + pub __bindgen_padding_0: [u8; 4usize], + pub response_buff_offset: u64_, + pub message_buff_offset: u64_, + pub migration_buff_offset: u64_, + pub error_buff_offset: u64_, + pub guest_rpc_trace_buff_offset: u64_, + pub migration_buf_cpu_access_offset: u32_, + pub is_migration_in_progress: u8_, + pub __bindgen_padding_1: [u8; 3usize], + pub error_buff_cpu_get_idx: u32_, + pub guest_rpc_trace_buff_cpu_get_idx: u32_, + pub attached_vgpu_count: u32_, + pub is_gr_init_done: u8_, + pub __bindgen_padding_2: [u8; 3usize], + pub host_info: [VGPU_CPU_GSP_CTRL_BUFF_REGION__bindgen_ty_1__bindgen_t= y_1; 16usize], +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone, MaybeZeroable)] +pub struct VGPU_CPU_GSP_CTRL_BUFF_REGION__bindgen_ty_1__bindgen_ty_1 { + pub vgpu_type_id: u32_, + pub host_gpu_pci_id: u32_, + pub pci_dev_id: u32_, + pub vgpu_uuid: [u8_; 16usize], +} +impl Default for VGPU_CPU_GSP_CTRL_BUFF_REGION { + fn default() -> Self { + let mut s =3D ::core::mem::MaybeUninit::::uninit(); + unsafe { + ::core::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_VERSION_NEGOTIATION: MESSAGE =3D 1; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_SETUP_CONFIG_PARAMS_AND_INIT: MESSAG= E =3D 2; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_RESET: MESSAGE =3D 3; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_MIGRATION_STOP_WORK: MESSAGE =3D 4; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_MIGRATION_CANCEL_STOP: MESSAGE =3D 5; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_MIGRATION_SAVE_STATE: MESSAGE =3D 6; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_MIGRATION_CANCEL_SAVE: MESSAGE =3D 7; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_MIGRATION_RESTORE_STATE: MESSAGE =3D= 8; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_MIGRATION_RESTORE_DEFERRED_STATE: ME= SSAGE =3D 9; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_MIGRATION_RESUME_WORK: MESSAGE =3D 1= 0; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_CONSOLE_VNC_STATE: MESSAGE =3D 11; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_VF_BAR0_REG_ACCESS: MESSAGE =3D 12; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_UPDATE_BME_STATE: MESSAGE =3D 13; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_RESET_MIGRATION_BUFFER_PTR: MESSAGE = =3D 14; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_RELEASE_CLIENT_DATABASE: MESSAGE =3D= 15; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_CHECK_IS_ALIVE: MESSAGE =3D 16; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_SEND_STATIC_INFO: MESSAGE =3D 17; +pub const MESSAGE_NV_VGPU_CPU_RPC_MSG_MAX: MESSAGE =3D 18; +pub type MESSAGE =3D ffi::c_uint; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone, MaybeZeroable)] +pub struct VGPU_CPU_GSP_DISPLAYLESS_SURFACE { + pub sequence_update_start: u64_, + pub sequence_update_end: u64_, + pub effective_fb_page_size: u32_, + pub rect_width: u32_, + pub rect_height: u32_, + pub surface_width: u32_, + pub surface_height: u32_, + pub surface_size: u32_, + pub surface_offset: u32_, + pub surface_format: u32_, + pub surface_kind: u32_, + pub surface_pitch: u32_, + pub surface_type: u32_, + pub surface_block_height: u8_, + pub __bindgen_padding_0: [u8; 3usize], + pub is_blanking_enabled: VGPU_CPU_GSP_BOOL, + pub is_flip_pending: VGPU_CPU_GSP_BOOL, + pub is_free_pending: VGPU_CPU_GSP_BOOL, + pub is_memory_blocklinear: VGPU_CPU_GSP_BOOL, +} +#[repr(C)] +#[derive(Copy, Clone, MaybeZeroable)] +pub union VGPU_CPU_GSP_RESPONSE_BUFF_REGION { + pub buf: [u8_; 4096usize], + pub __bindgen_anon_1: VGPU_CPU_GSP_RESPONSE_BUFF_REGION__bindgen_ty_1, +} +#[repr(C)] +#[derive(Debug, Copy, Clone, MaybeZeroable)] +pub struct VGPU_CPU_GSP_RESPONSE_BUFF_REGION__bindgen_ty_1 { + pub message_seq_num_received: u32_, + pub message_seq_num_processed: u32_, + pub result_code: u32_, + pub guest_rpc_version: u32_, + pub migration_buf_gsp_access_offset: u32_, + pub migration_state_save_complete: u32_, + pub is_migration_allowed: VGPU_CPU_GSP_BOOL, + pub __bindgen_padding_0: [u8; 4usize], + pub surface: [VGPU_CPU_GSP_DISPLAYLESS_SURFACE; 4usize], + pub error_buff_gsp_put_idx: u32_, + pub grid_license_state: u32_, + pub guest_os_type: u32_, + pub frl_config: u32_, + pub guest_info: VGPU_CPU_GSP_GUEST_INFO, + pub is_guest_info_populated: VGPU_CPU_GSP_BOOL, + pub guest_rpc_trace_buff_gsp_put_idx: u32_, +} +impl Default for VGPU_CPU_GSP_RESPONSE_BUFF_REGION__bindgen_ty_1 { + fn default() -> Self { + let mut s =3D ::core::mem::MaybeUninit::::uninit(); + unsafe { + ::core::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} +impl Default for VGPU_CPU_GSP_RESPONSE_BUFF_REGION { + fn default() -> Self { + let mut s =3D ::core::mem::MaybeUninit::::uninit(); + unsafe { + ::core::ptr::write_bytes(s.as_mut_ptr(), 0, 1); + s.assume_init() + } + } +} From nobody Fri Sep 25 10:37:46 2026 Received: from DM1PR04CU001.outbound.protection.outlook.com (mail-centralusazon11010013.outbound.protection.outlook.com [52.101.61.13]) (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 BDA1940B383 for ; Mon, 14 Sep 2026 07:52:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.61.13 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372337; cv=fail; b=gjQsozvNhnzZMTZpvRwdMfAv0MdMvST5lkvJlayIFuFo6Dns2BgojVR2T/Cb0fWVS3QWcK+kIPlVn+EZNpmLIZaJSJLN/BgfO/KAKZlghYvOXzHUWC9uQEemNqOkf31Od4Dk/mdZurZ714sRVeHXiJHU4tyWjUfTRopK5YxcQ8E= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372337; c=relaxed/simple; bh=V6NyWZmYhfYM7T5r/Mm7VENiVknDB0s+8Bgwa3eN64M=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=MJqSAZarf8mOYQmDytlEni7dpuJ0Sjwe+tmdwO8pq2NYtCUHCvtkLRD6AB1OwBrcc79usqWFCYnLgFeKJHIgjmMJntZbN6KcXKDXwuY7Y6g2zV/Glmw80eEeBXRttha2GytjBQnqh+mjU0JxiPx5FwCadwBg7m8XF/Su6F8r5Bs= 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=PM2ilXpS; arc=fail smtp.client-ip=52.101.61.13 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="PM2ilXpS" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QDET6D5/5zKcv4yOFer2jJ6TejQKDVU4x+PzHoZwMEJOrO2xwcX1ZIJLdT689XZi/Vid6JaGkr0MAXZTNYMdR8mWObMTMIfZIC87uJNERGo01IwSbAV+Ykuyq2RE2tZU6SOC54AVBTPLlwBagm74CEtvQT+ps2ezGcMGW+jzqO4PaAmihTWEdocYz8/4uYTwdzEr38Sq0EURrFLkd+O2dYVAs/cqaSHWZMhtrhIwKdr5H4IXnnoMD3cEqjsgyQCyCxizrimbnHKWcqrK90TqxejqMhgAtIWJPI+Y9kx7oZGt1yw9BF7VEu5ezNASpDYiJcr/5h8u8yuw1E2TKPqV1Q== 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=YP2gb2V6G6/zTJMwVKH4cD9GrOqTcsphCp8BTTIr8Ig=; b=MNJYBj4/giA4vfP4uZ+1+60nZ58AZXRyJkuuDyFj3O4sv5kATKkm3hNniX0Ue2n/AIrVHIqB9TGDcc+cIff7BqxwRjiENG7DvmaHJLWRuPduSQh4JRMJxRThplVGR+pWIwicIFOZ4U68vwQPqs3tFFhvJ+mPaNY6joSwJXG4+4J17g5xhM43zpgz+BuuqJKKh2IWVWKXbNN78S+YcoaUtY0Bbh8BqgTMwi89qR2AKDTVWVhEHGlLCXVU2Pl++xoV+BSSAc8VENz1oMi3zlttKBPB6IoxRH0R+W3bV4DijBRKD5MQPFtbFTydLCr1dDzEKPx6unYLrWX8AbCjSJFAQg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=YP2gb2V6G6/zTJMwVKH4cD9GrOqTcsphCp8BTTIr8Ig=; b=PM2ilXpShbNEi44PGueDl37e+vLAVrKXNXSVu11h+pcOv4nK0UuPOmyIhbhsTrhEBIQ5xmJyjYf/fdzS48S76/IkVaHZOcHYbuxlMkX8Yn/aNPk7DsGy1ZeZOMcM5meMrgYA3PGQVwSAa/wAbBZiZu/M+eSDalK83Lv8Xlehl4NbwWgd4st1d6NeWy8k7BOB5EGehWycss/xn7DncUM6wa5NePweZOdDSMWaa5ODrO8kT9VK/H6UN1LG5zyXYWpNtVSvZMg2//nyYyRkXF4873IlbzoF82qaC67j4wC1gRkSPKucMMxL0vQKLVuAkgU55iL+h3YcmR5fmYKNauQC4Q== Received: from MN2PR22CA0012.namprd22.prod.outlook.com (2603:10b6:208:238::17) by MW9PR12MB999209.namprd12.prod.outlook.com (2603:10b6:303:301::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.10; Mon, 14 Sep 2026 07:52:10 +0000 Received: from BN2PEPF0000A88E.namprd04.prod.outlook.com (2603:10b6:208:238:cafe::4c) by MN2PR22CA0012.outlook.office365.com (2603:10b6:208:238::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:52:09 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF0000A88E.mail.protection.outlook.com (10.167.248.180) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:52:09 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:51:50 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:50 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:51:42 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 18/32] gpu: nova-core: vgpu: add VRAM slot allocator Date: Mon, 14 Sep 2026 10:48:53 +0300 Message-ID: <20260914074907.1399629-19-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000A88E:EE_|MW9PR12MB999209:EE_ X-MS-Office365-Filtering-Correlation-Id: 9861c4aa-1de1-483d-c7c4-08df1235148f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|23010399003|1800799024|82310400026|36860700016|10067099003|11063799006|56012099006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: 9ecWjH5mVuu9LhmKb67Jxet+ZTD/bdLYnR2FljlGXwzCrLKnkyRlNbPpP21bIrMjTOVXpd4nneJbgLYTpxHcWROCLMyRNTKC2lnfECMC5b1I/BNNY+YhrhK4Vz/YWUl436hunXMaZwi8ufOVPiF2bCHKOJjKwGfVqwuJIHD2Fw0ASAqW1/5GIimyt/LgxxoM800gd1uPWP4/+SQafmIbkfHCTH/N7SFuJw74Na+EI1JMVv/0iiKtSfNO+gBd8jOBZGAGYO2nnn6tp1aZORp8N3JHugEVvXshRXzKCg6iTTRjWrZpD6fMRZ/3ZXNkP6uAU6/NZYhN7y/1t2GoqSEXnkxdbXOTVepdFAsmByewUMImeGYwAEJoazi1VBfJAvS8Gp1oa/nYwRKsrDG1j7b3Xv1lBOnAQY0ug09vsV95TU+zx5C8jcZTKctanNKVy8wWd56BklEpQdSPttA6em1X0nmO4UX3CRuDuFVP7Pm/IFF4F7D8X8baWHOGivMhuAg9nTdCq891WLN8WMjjsrVuTXd24vDBVK9gPBQDcYB19Oi/EY+z8FiDo0yU0b+G9uw9l3PKKXLHGgDbi+98sAT/ekE53Qt1Vujd0SRIa6oAqNmAzpDgT6LqJ3sikGQqcIKbij9WGEaXEwpdNT/wS2rwB/WTjDA/zDp+239UcKheoHIYGkZxSHfNwRiJz2z+o95wbDzYUVsO2NebpgeHJr/piQ== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(7416014)(376014)(23010399003)(1800799024)(82310400026)(36860700016)(10067099003)(11063799006)(56012099006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: S93UsrbM/1eby5T8XdlWLDvqyqfsIeEOVtW3lvP3laR9a5HyhrbD0HFmUOJ3Yb9AI9UCaMCS4kUbxxyH6/j4BChmVY5nWox8vm4S8smo8HHPGt6i58iPyy4uvhesksRNZNcPLglQNlZdEnTPcItS+re6eTfsHjATsGE4qbBOwCoTS8X74RNIS2Zq4+s2u2q/Qce9OQ+xmApEZWuaOsIkjXEa1fQk96+CvrdKa7l+lIUMfWQNYqlH3BxJBFHIfHOM/aKobf2ZNDfVOth9m2LPY4KfKgNu9aAS7UTaEb610DzpvLfh/kMktEaYpjL0ZxPrFv1JJplExmduE7TzSLSmj05sZpKexNMtfE44I34syW5hBt/sEJIuSxk6j59ymFIXKxpZtZ8oG5w0YUbjxoQn4YPddxqndQAC9OXVLH8rfOWWkoxg2yvxVyXClMOETugt X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:52:09.5634 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9861c4aa-1de1-483d-c7c4-08df1235148f X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000A88E.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MW9PR12MB999209 Content-Type: text/plain; charset="utf-8" From: Alok Kumar A vGPU type specifies the guest VRAM and GSP plugin management-heap sizes for each instance. Allocating these regions independently fragments VRAM and does not preserve a stable layout for the vGPU type. Add a standalone slot allocator that reserves one exact VRAM range and tracks assignments in a bitmap. Validate the vGPU type's layout and reject an allocation request whose layout differs from the active pool. Lay out all guest VRAM slots first and all management-heap slots second, pairing them by bitmap index. Require the guest VRAM stride and pool base to satisfy the required VMMU-segment alignment. Signed-off-by: Alok Kumar Co-developed-by: Zhi Wang Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/vgpu.rs | 1 + drivers/gpu/nova-core/vgpu/vram.rs | 146 +++++++++++++++++++++++++++++ 2 files changed, 147 insertions(+) create mode 100644 drivers/gpu/nova-core/vgpu/vram.rs diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs index 348af9ea3fc2..6a876f8539f0 100644 --- a/drivers/gpu/nova-core/vgpu.rs +++ b/drivers/gpu/nova-core/vgpu.rs @@ -21,6 +21,7 @@ }; =20 mod hal; +mod vram; =20 /// vGPU state detected during GPU construction. #[derive(Debug, Clone, Copy)] diff --git a/drivers/gpu/nova-core/vgpu/vram.rs b/drivers/gpu/nova-core/vgp= u/vram.rs new file mode 100644 index 000000000000..2dc751b28ae3 --- /dev/null +++ b/drivers/gpu/nova-core/vgpu/vram.rs @@ -0,0 +1,146 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! VRAM slot allocation for vGPU instances. + +#![expect(dead_code)] + +use kernel::{ + bitmap::BitmapVec, + prelude::*, + sync::Arc, // +}; + +use crate::mm::{ + vram::{ + VramBlock, + VramRegion, // + }, + GpuMm, // +}; + +const VRAM_SLOT_MIN_ALIGN: u64 =3D 4096; + +#[derive(Clone, Copy, PartialEq)] +pub(super) struct VgpuVramLayout { + pub(super) type_id: u32, + pub(super) max_slots: u32, + pub(super) fb_size: u64, + pub(super) heap_size: u64, + pub(super) fb_align: u64, +} + +impl VgpuVramLayout { + fn validated(mut self) -> Result { + if self.max_slots =3D=3D 0 || self.fb_size =3D=3D 0 || self.heap_s= ize =3D=3D 0 { + return Err(EINVAL); + } + self.fb_align =3D core::cmp::max(self.fb_align, VRAM_SLOT_MIN_ALIG= N); + if !self.fb_align.is_power_of_two() { + return Err(EINVAL); + } + if self.fb_size & (self.fb_align - 1) !=3D 0 + || self.heap_size & (VRAM_SLOT_MIN_ALIGN - 1) !=3D 0 + { + return Err(EINVAL); + } + Ok(self) + } +} + +/// Dropping a slot does not release its reservation. +#[must_use] +pub(super) struct VgpuVramSlot { + index: usize, + pub(super) fbmem: VramRegion, + pub(super) mgmt_heap: VramRegion, +} + +impl VgpuVramSlot { + /// Return this slot's index in the allocation pool for its vGPU type. + pub(super) const fn index(&self) -> usize { + self.index + } +} + +pub(super) struct VgpuVramSlotAllocator { + backing: Arc, + layout: VgpuVramLayout, + fb_region_size: u64, + used: BitmapVec, +} + +impl VgpuVramSlotAllocator { + pub(super) fn new(mm: &GpuMm<'_>, layout: VgpuVramLayout) -> Result { + let layout =3D layout.validated()?; + let max_slots =3D u64::from(layout.max_slots); + // Keep guest VRAM slots contiguous so each starts at `fb_align`; + // interleaving page-aligned heaps could misalign later slots. + let fb_region_size =3D layout.fb_size.checked_mul(max_slots).ok_or= (EINVAL)?; + let heap_region_size =3D layout.heap_size.checked_mul(max_slots).o= k_or(EINVAL)?; + let pool_size =3D fb_region_size.checked_add(heap_region_size).ok_= or(EINVAL)?; + + let used =3D BitmapVec::new( + usize::try_from(layout.max_slots).map_err(|_| EINVAL)?, + GFP_KERNEL, + )?; + let backing =3D mm.alloc_vram_range(0..pool_size, VRAM_SLOT_MIN_AL= IGN)?; + if !backing.address().is_multiple_of(layout.fb_align) { + return Err(EINVAL); + } + + Ok(Self { + backing, + layout, + fb_region_size, + used, + }) + } + + pub(super) fn matches_layout(&self, layout: VgpuVramLayout) -> Result<= bool> { + Ok(self.layout =3D=3D layout.validated()?) + } + + pub(super) fn alloc(&mut self, layout: VgpuVramLayout) -> Result { + if !self.matches_layout(layout)? { + return Err(EBUSY); + } + + let bitmap_index =3D self.used.next_zero_bit(0).ok_or(ENOSPC)?; + let slot =3D u64::try_from(bitmap_index).map_err(|_| EINVAL)?; + let fb_offset =3D self.layout.fb_size.checked_mul(slot).ok_or(EINV= AL)?; + let fb_end =3D fb_offset.checked_add(self.layout.fb_size).ok_or(EI= NVAL)?; + let heap_offset =3D self + .fb_region_size + .checked_add(self.layout.heap_size.checked_mul(slot).ok_or(EIN= VAL)?) + .ok_or(EINVAL)?; + let heap_end =3D heap_offset + .checked_add(self.layout.heap_size) + .ok_or(EINVAL)?; + let fbmem =3D self.backing.region(fb_offset..fb_end)?; + let mgmt_heap =3D self.backing.region(heap_offset..heap_end)?; + + self.used.set_bit(bitmap_index); + + Ok(VgpuVramSlot { + index: bitmap_index, + fbmem, + mgmt_heap, + }) + } + + /// Drop a slot's region views and return its reservation to this pool. + /// + /// The slot must come from this allocator. All accesses and mappings = of its + /// regions must end before releasing it. + pub(super) fn release(&mut self, slot: VgpuVramSlot) { + let index =3D slot.index; + debug_assert_eq!(self.used.next_bit(index), Some(index)); + drop(slot); + self.used.clear_bit(index); + } + + pub(super) fn is_empty(&self) -> bool { + self.used.last_bit().is_none() + } +} From nobody Fri Sep 25 10:37:46 2026 Received: from PH7PR06CU001.outbound.protection.outlook.com (mail-westus3azon11010066.outbound.protection.outlook.com [52.101.201.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 C92CD3E764F for ; Mon, 14 Sep 2026 07:52:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.201.66 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372347; cv=fail; b=AxOokJ6Dx/UtKiQghqgAoyblRrzvXgHHS8kyVUABy7xW7mvx6Mu489No+U3gGpnWXXr7ptgZrZA0grcyLcBPzoorRgYpXgfdHXvJ8rkLJ2waRkf1W39+ucOmBkStRJXo2bc+11Y7bxEJXVEBCSwSC0esK5JfJ8vh1V57zRcmm18= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372347; c=relaxed/simple; bh=uKRs5/8vFwqQBRJxQ7xU11r/fttzcR//d2bycDdYwVg=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=lCepSkorTlFRzqIU6bjSgiYc2S4ztBS9LgZbwPAigWBnVvmglHrWREx4IVNcxDo7sMKZjNW254ngAmHsdSn8GAPw8C8qyn4JqVxt6cJp4s3l0XjEGdWJHYaaJr6vsenszyDaZ+d7qSmjxDxED4zqw87eUC/aGQHJ3X0yT19adsY= 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=Rh5SAWMP; arc=fail smtp.client-ip=52.101.201.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="Rh5SAWMP" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MMG6B2i/bgm/7IBv7/xH3gtDAVIOtzC8ovlBeRbGPEsJFKMC4c12UXmCbsAtgdAAOa8xUllT7XJmAXUYkJjmUhNBXpYibBQko3+d5Kbg0vLXwNc70lvMngvzF6umv0ar4b3mQvR/N90U/B8qkwq+OpLtX5jyGRBcvKQUtc4dpy/cN3OnYKQR9kNmJBwDrUEK+5H5B2WSHJokMPGjRtyUafQ5ZDkV3yeih9tthOLBRh8lXfx/L9tRJ1RCP+NbofLKK6c+j2hT6v/xg4JsPvOgJ9oU9IO/WJ7uFdJRkceChig/xuwtdaMPjwn9N7TgDOyez4IyCrS0OoNiDncT9kud2A== 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=RRoWMlFkfabcZ4MStzMT10yvrw/fHhJgwEcFNe8HWm8=; b=UVDq4aWHrNT4qE8h7v83u/F44hZjLSrobfaxve6T+3ih23IzpeXsZva+rR++3J4+tEwAxdTqtwVZJDl3nTT2FmeyCh8RnWj/59NQ+n3FipgM30DL1ik3riLA9pR6ueF7z3Y1WtuZnhkhlB/xZSWlf047HZRA0rJDtHzXhcKDJqa0TAdP2RUnO3oWkFlZrqDXG/t6kip2X4b3ZX7pfKRwTHfTuMMxrSnBTjW50mROUA/TNPR3hJhSXFxxbS1yFyTJqCSHvENsP4R3IqINeG/4Ji+Iz0kUfC0KDTKNB6wKQp73wYmYgjinw341Q4+l8DE33WnRPIPFkenLzhgsSFcvlg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=RRoWMlFkfabcZ4MStzMT10yvrw/fHhJgwEcFNe8HWm8=; b=Rh5SAWMPjWf8reFu2EJ6yPn0u3N9czymO8yIPhW/96+yVgyuEoC38WZJVBZmHIjM5+Iz2dK/mNPwnoNOhfM/CmtTL+tKnaTrl/e/hQubQIcJcAMBeSqxtgywO/4MFWpuX4KUKtrwEVEufiQIjQO4JpBWym34KLR6OzLbwuUmEOvnCYAx1jMliQRR9bYnYk+YqG1SjqmJeoGLsNSqQmFnX02R7AX00wtvIQZQi3TokzQXCUIwD5hMRRPOI3oRIxuB0sg9soQ0339Hn8YvzDnuHVTYmcrr9fkUa3M4glkQIyzIpBn/9/HrCRPiWkOj178y2qEa1PVEFO6QOgjZtkHvvA== Received: from BN9PR03CA0362.namprd03.prod.outlook.com (2603:10b6:408:f7::7) by DM6PR12MB4074.namprd12.prod.outlook.com (2603:10b6:5:218::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:52:19 +0000 Received: from BN1PEPF0001854B.namprd05.prod.outlook.com (2603:10b6:408:f7:cafe::62) by BN9PR03CA0362.outlook.office365.com (2603:10b6:408:f7::7) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:52:19 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF0001854B.mail.protection.outlook.com (10.167.248.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:52:18 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:58 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:51:58 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:51:50 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 19/32] gpu: nova-core: gsp: factor out NVKV payload conversion Date: Mon, 14 Sep 2026 10:48:54 +0300 Message-ID: <20260914074907.1399629-20-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF0001854B:EE_|DM6PR12MB4074:EE_ X-MS-Office365-Filtering-Correlation-Id: 1296d3d8-5e8b-4903-64b3-08df12351a24 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|7416014|376014|23010399003|1800799024|82310400026|11063799006|56012099006|10067099003|22082099003|18002099003|6133799003|3023799007; X-Microsoft-Antispam-Message-Info: /b8EOLFci6R6QbKKJW6R4X8czuKCI/b5Kd0DzwXrdWn9y128lkWdwYm22+h42WSBzhmWnvA702fKpBg1F0L3/jmriyg7c8OyoAB3numt5nsPizyXQS4xbyryi5NlodaEN0cY0a9rRpo8X4JZr3RbDUS9S5X5S/rE/2qaxKMxEatNDS3Lqo56gNq3f5aBkXPiXc6rqW9VdOfDlYIer5mp3/qvIXybypPf8BWZbwnprrDnG23llrKzoSq6hXHm/zmM4PoV56HRXkwfCcmWc6CS3gzOvJVYA1fLADCyX258mPu3s4iVtJ3GJKnn1sceNtULWZAJpKc0fHHcmQDXYpYtJ2BvEWRn2/8V/l+YZJQ+ZbA9fF1tHEzmxPwQ5EkNpr5HpqZoZKZjpTz+p8XvK3FKLaf/YPDZAJJnp3R3v1BWQiGFJFzaoQDmyEDDRtuw72G9Tv7skUJ3dm2QQK/IB3bypvAXC6fgZCMImFPAxMMfkgfK7B8FqJD0mF53ZfXogu+d6LV5fWsCp79mMSBRqJmPiFC/CZNxvk/9q8DUmoN5bV9gkbBwkBtu66RDrSEdTOP2yFM48F877skDBN5Fxt2BKWksaySKN+mBeXUHxUk8W7SMQlRPq+MI+VliBuCmeS963WpYtEZdlZ83HRQomQunIHf4CdEoRckM2KnjfMzB5Wwj+K36SYu9+8o7NGT/ex1L3eIfve0AVA4EEcgnFlkSAQ== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(36860700016)(7416014)(376014)(23010399003)(1800799024)(82310400026)(11063799006)(56012099006)(10067099003)(22082099003)(18002099003)(6133799003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: ahPT0MZzGCSPV37qCBmOeG4w+Sm9eO/asDyf+xmxopsStTjMilJ+qEnfQq7UJrQO+k3CcD/GU67OUnWBB9xMER+9zmrYKjAeNRowkKRuMS2W1cn7SI9PZnoL+veEDbfYMSBD/CvUagaFfslND0FCq5AH2s4PCWQmzrRAMVyX3EmKXUL3IVSAegabe2BuaG4+CCADglh1RtXzu8RGKauKCHviXtEqNIkB+l8tgXHPoYxVrHJntszbeec/wQnR5diwc6oMwC7HvKZGnt1rQM2RVXEnqwYKaRD9Jc4OBmi7mmOWaMbkBKXL+vrevwhC60DGWZlUsOKvdavIjinpXB3bAfscVYWixIFhEgbCkMt3CrNqzDHj+g7o0KG53/n4vp0jIZsfRWzXn183KDXL5PLEyHqwkkhBRpXsBSyNS184up3JKVemdFvKfFDv2n5w4Vw7 X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:52:18.9149 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1296d3d8-5e8b-4903-64b3-08df12351a24 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF0001854B.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM6PR12MB4074 Content-Type: text/plain; charset="utf-8" Both GSP initialization and vGPU property queries decode their replies as NVKV streams. Move the byte-to-word conversion helper into the NVKV module and make that module accessible to the vGPU firmware interface. No functional change is intended. Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp.rs | 2 +- drivers/gpu/nova-core/gsp/commands.rs | 24 +----------------------- drivers/gpu/nova-core/gsp/nvkv.rs | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index 93291c67d6de..5b1e4eb7cad8 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -24,7 +24,7 @@ pub(crate) mod cmdq; pub(crate) mod commands; mod fw; -mod nvkv; +pub(crate) mod nvkv; mod regs; =20 pub(crate) use fw::{ diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index 7ca5ec2a58d9..7945a191bd08 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -33,6 +33,7 @@ GMCAPI_CMD_GSP_SUSPEND, // }, nvkv::{ + nvkv_words, Decoder, Encodable, EncodedStream, @@ -41,7 +42,6 @@ }, GspBootContext, }, - sbuffer::SBufferIter, vgpu::VgpuState, // }; =20 @@ -256,28 +256,6 @@ fn decode_gsp_init_reply( decode_gsp_info(&nvkv_words(payload_0, payload_1)?) } =20 -/// Joins the two halves of a wrapped payload into the `u64` words an NVKV= stream is made of. -/// -/// # Errors -/// -/// - `EIO` if the combined length is not a whole number of words. -/// - `ENOMEM` if the buffer cannot be allocated. -fn nvkv_words(payload_0: &[u8], payload_1: &[u8]) -> Result> { - let bytes =3D SBufferIter::new_reader([payload_0, payload_1]).flush_in= to_kvec(GFP_KERNEL)?; - let words =3D bytes.chunks_exact(size_of::()); - if !words.remainder().is_empty() { - return Err(EIO); - } - - let mut out =3D KVVec::with_capacity(bytes.len() / size_of::(), G= FP_KERNEL)?; - for word in words { - let word: [u8; size_of::()] =3D word.try_into().map_err(|_| E= IO)?; - out.push(u64::from_le_bytes(word), GFP_KERNEL)?; - } - - Ok(out) -} - /// Decodes the static GPU configuration from an NVKV stream. /// /// # Errors diff --git a/drivers/gpu/nova-core/gsp/nvkv.rs b/drivers/gpu/nova-core/gsp/= nvkv.rs index e7a9549919fb..9f2119b98b26 100644 --- a/drivers/gpu/nova-core/gsp/nvkv.rs +++ b/drivers/gpu/nova-core/gsp/nvkv.rs @@ -27,6 +27,30 @@ }; use zerocopy::Immutable; =20 +use crate::sbuffer::SBufferIter; + +/// Joins the two halves of a wrapped payload into the `u64` words an NVKV= stream is made of. +/// +/// # Errors +/// +/// - `EIO` if the combined length is not a whole number of words. +/// - `ENOMEM` if the buffer cannot be allocated. +pub(crate) fn nvkv_words(payload_0: &[u8], payload_1: &[u8]) -> Result> { + let bytes =3D SBufferIter::new_reader([payload_0, payload_1]).flush_in= to_kvec(GFP_KERNEL)?; + let words =3D bytes.chunks_exact(size_of::()); + if !words.remainder().is_empty() { + return Err(EIO); + } + + let mut out =3D KVVec::with_capacity(bytes.len() / size_of::(), G= FP_KERNEL)?; + for word in words { + let word: [u8; size_of::()] =3D word.try_into().map_err(|_| E= IO)?; + out.push(u64::from_le_bytes(word), GFP_KERNEL)?; + } + + Ok(out) +} + mod encode; pub(crate) use encode::*; From nobody Fri Sep 25 10:37:46 2026 Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012032.outbound.protection.outlook.com [40.107.209.32]) (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 43C403F6C2A for ; Mon, 14 Sep 2026 07:52:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.209.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372354; cv=fail; b=WTLtrIbYyPURUNfqMZdevrQ8tQlCwI/Vyk9yvQuvgM/22OfQ32GqZJ7x0Rm5brx4LFzpgYtjde9+taZu6Oe0rfp3tsysYfPWNvT7283BRoAouDhSfJkTzajkE/iVi/DikbR9JeA7KAFH+FNAkCL7ai32LmhmUAngDA21GSQ23ko= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372354; c=relaxed/simple; bh=+Mp+ZFoxLT6p1+L495pPShg52kxcPnd3bhBz8Cx82MA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=h6O1TgKxqbBezjsXI3EGTZkHVylds6dRQ9WLvwxHGzKOJd7MzEjHNBILAq+d5TA52TFXLMDIRBMdUjRLStScDag5f3RnFzHpqoP87Nu4VFK/NoMEOQ2QQfTkbO+eYiUjXm1mbBia5tu/HEXYkbWEeKwFiFk3M233TBMcSwVJCPM= 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=XwN0SpwW; arc=fail smtp.client-ip=40.107.209.32 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="XwN0SpwW" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=yPDd32iH8zJIfwaJTIpL/a9KdAje4l7/OAXpXm+PDXBjnl4aZ2HGdzcqVGlcSv4kmYMT243J3DF+dwneI9sXbv9HLOShaB9jqFY1xPS9JFw6Nfrki198TFW1gWpLJk4MSP5rmslkcE3BQTH+0+vU2fnzB5nQdQpIwEYQ8jms94JSTYTJ8P4mGCO9OI5ujOzJLfleBPn2w+dswVfJltH1e+m1nDbY+9I9pM/LGwfHF3Yj1wLYzO+LEOIEBoyper0z+prrLIbYWK01DKD8HRBoGOn3S1dYjxXBhchZIbBDGCRw6dbFnNyN+EIK056RPgnujjazgyBkr34kxWOJFPNuwA== 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=+9IpiTPzyzgvmMzSGL3uPyJgy5xm9u/Rwm627UOMI6w=; b=qAzEskb5DxjHE1RNvnbfgcd9X5mpvM2m9Yxf0VM3UYIMDdgPx45ynL4K7i98XNgSxFx76tq6s9PaixZrXgHsbKbwvLeHlYd+4Nxwen2n7IGWArLzSH1ns4mdcU9SptyDT/taJCHJHNIJ/sDxD3GuZTMzNd3TzHQtu23vljlq8O7gMzXHQcQkVAfJ7QFQzkmobuBjQmm+k9kY70eUD3gAiQ62X1s/JQt3kVuI8xNS0a5P4S2z3mE1refQBuWHZp8LTDhpdP+dOK4DiJ2erG4H0vlAHQx99KmCd6Dg+klco8lzARNGFa2FzciV3xFHFEYWfCCLY9FXcv5K0AEVXjSXSA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=+9IpiTPzyzgvmMzSGL3uPyJgy5xm9u/Rwm627UOMI6w=; b=XwN0SpwWXCeQqaFia+x/CjEKYNp130EZe/eYCTybOXK+PjV8FbCKzQh81fh/1nkcUoWjy7vhg27WyOhgnNutKmzkQ2rkMiDfy+2VfH/hl/tj4v8hNqTbr1P5wJhTnFCAKtjnk8jmtAeC5E0YAQLfuBujY/MKSLry6FqXqwMm+2HJGJGERMiOnJofqO8phbwcoGN1HZZ/9yHsLjjr+5gFldrDTgU2hKQl3eiXg4eWy8BLsbzFA0KVuFWciO7VH0+RJsbtLRHh3RbqGVvsK7YFhkkAeZ0XEuSSM2BuTjKuWHF+tEl5P6JHRfrKU3b4l2yBfS1JQmjw8PnyaEvTxbxBzw== Received: from BL1P223CA0017.NAMP223.PROD.OUTLOOK.COM (2603:10b6:208:2c4::22) by CH8PR12MB735095.namprd12.prod.outlook.com (2603:10b6:610:32c::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.8; Mon, 14 Sep 2026 07:52:25 +0000 Received: from BN1PEPF00018545.namprd05.prod.outlook.com (2603:10b6:208:2c4:cafe::85) by BL1P223CA0017.outlook.office365.com (2603:10b6:208:2c4::22) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:52:25 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018545.mail.protection.outlook.com (10.167.248.4) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:52:25 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:06 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:06 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:51:58 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 20/32] gpu: nova-core: vgpu: query VF assignments and properties Date: Mon, 14 Sep 2026 10:48:55 +0300 Message-ID: <20260914074907.1399629-21-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018545:EE_|CH8PR12MB735095:EE_ X-MS-Office365-Filtering-Correlation-Id: b40ef9c2-9352-4b4a-b6d0-08df12351dd0 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|82310400026|23010399003|1800799024|7416014|376014|10067099003|56012099006|11063799006|6133799003|18002099003|3023799007|22082099003; X-Microsoft-Antispam-Message-Info: H2eNpo01WvRExkSA46J5yXqlwaS/7OC0ImYPUwxfB7OFtj3sCe0lP1pdaJrUHH0B43FhtJenDYiyDwLo6zgnIsyozV0AnqMsghLdDtNSwIgo30+ZzTHNcKPUcwutJ8HmazUQfcAEKKRtenXItBwMtJacgMxvJn/ZUu2/KSiteOnX+FDBOyVkEiCxUFb5M4QfgTCHcWmCaKE1yBduTkVRNTdA3TyEuiWMBYpkqsmv7wIWpXsh3UuheKwS5mMODirOUlmf7/T/Xo9UMr4gtR8ksm45qaCPA7C7ZU5vtZmgFEPRtNWrRAyVu38DDePoxkKTvpGeHLdtkLwFY7vLYyAvJqgino6ZSrb+5GidkOy6JCg3FugFNp+iGf+G4tMqdfSi+wLuc1H4kCJNEjlWvfZfEM7VlIb9FEHi2WdAFQthiu9kfWwzGrSZ4crkakFUEktwKCm0gjfxDOH2Tv8DB0pcdi6Q/j1EqJNuUeKSUqXbFFZ820T8bdX3TfIPSwMWUWiFoz1Y67yFm7PBD6+kWwo3sQxwkC4S3PRYi9VKXq+toJMCOLtL2BtIGlyR4CjpGgU1YFQY/9n4trOGfiyu1Sxw/wn2ECoqgm4pZbEfiIQ6vqGtOPn4SxGlUeugNfcbT4PUIXyCzFsOG0DbHZKdgC1NMbVqHtQcNNKdM1bumMU17H8t2xA8W90lOyXUJiGwGZ9zMWbFabJNmtOVoYEVQZwQWw== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(36860700016)(82310400026)(23010399003)(1800799024)(7416014)(376014)(10067099003)(56012099006)(11063799006)(6133799003)(18002099003)(3023799007)(22082099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 49aVDtvhdRMLLCja9+P3XcX61VtUP4YoPIRP86bOIUXUlNQqMEtFlIcwWkEjzdTVSCeuBIFz3p4wR1QpCud6g/gAqJQAMUflKJWHuGmzXmcpcJqPr1AZx5UzkyVFHpSziqR6wOl5yO4aiKCouOLXmthe312SZ2fN5KTzx2WlAed8wEDLgeuww3hxKg99EM5KcuE8Kw0p0ZTnEzSBEMvRephnXtLbLY+LE37+UIKdPw3C59np/6ANkV/lhsa5nuh3zXtWfz2XMAzImb7crNAtV+hp5ngrbmXRLzvhTLi9Wabuu9esuSmzivIuFzirvG1eD3NqmPFDHr4zTacDZyjkuudwujseF7q6yWIj3eDK+hcdrz4uSJ5OncmLkxcgKpN/fZa7lRX2XbWiZDV8dZgX0KnIC7WnHP5hxW4UX/Ko+erMryfaR7RRi0li4lx132Ni X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:52:25.0891 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b40ef9c2-9352-4b4a-b6d0-08df12351dd0 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018545.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH8PR12MB735095 Content-Type: text/plain; charset="utf-8" A vGPU instance is created in the VFIO open path. Before creating it, the path queries the VF's assigned vGPU type and its properties to determine how much of each resource to allocate. Add GMC queries for the assigned vGPU type and its properties, decoding the NVKV response with the vGPU properties schema. Co-developed-by: Eliot Courtney Signed-off-by: Eliot Courtney Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp.rs | 1 + drivers/gpu/nova-core/gsp/cmdq.rs | 1 - drivers/gpu/nova-core/gsp/fw.rs | 2 +- drivers/gpu/nova-core/vgpu.rs | 2 + drivers/gpu/nova-core/vgpu/commands.rs | 71 +++++++++++++++++ drivers/gpu/nova-core/vgpu/fw.rs | 17 +++++ drivers/gpu/nova-core/vgpu/fw/commands.rs | 93 +++++++++++++++++++++++ 7 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 drivers/gpu/nova-core/vgpu/commands.rs create mode 100644 drivers/gpu/nova-core/vgpu/fw.rs create mode 100644 drivers/gpu/nova-core/vgpu/fw/commands.rs diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index 5b1e4eb7cad8..c961ea029fed 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -28,6 +28,7 @@ mod regs; =20 pub(crate) use fw::{ + r000_00 as bindings, GspFmcBootParams, GspFwWprMeta, LibosMemoryRegionInitArgument, diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index 137242ca0b11..f4a0c8671bc8 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -505,7 +505,6 @@ pub(crate) struct GmcResponse { /// Response status (`NV_STATUS` code). Zero means success. pub(crate) status: u32, /// Response payload copied out of the message queue. - #[expect(dead_code)] pub(crate) payload: KVec, } =20 diff --git a/drivers/gpu/nova-core/gsp/fw.rs b/drivers/gpu/nova-core/gsp/fw= .rs index ac94fb564bfd..882780f38ba6 100644 --- a/drivers/gpu/nova-core/gsp/fw.rs +++ b/drivers/gpu/nova-core/gsp/fw.rs @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AF= FILIATES. All rights reserved. =20 pub(crate) mod commands; -mod r000_00; +pub(crate) mod r000_00; =20 // Alias to avoid repeating the version number with every use. use r000_00 as bindings; diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs index 6a876f8539f0..0f9f5be752b5 100644 --- a/drivers/gpu/nova-core/vgpu.rs +++ b/drivers/gpu/nova-core/vgpu.rs @@ -20,6 +20,8 @@ gsp::commands::FifoEngineList, // }; =20 +mod commands; +mod fw; mod hal; mod vram; =20 diff --git a/drivers/gpu/nova-core/vgpu/commands.rs b/drivers/gpu/nova-core= /vgpu/commands.rs new file mode 100644 index 000000000000..b5fa3575b1d7 --- /dev/null +++ b/drivers/gpu/nova-core/vgpu/commands.rs @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! vGPU firmware command operations. +//! +//! Sends requests, checks responses and coordinates the firmware command +//! sequences used by instance lifecycle operations. + +use kernel::prelude::*; + +use crate::gsp::{ + cmdq::Cmdq, + nvkv::{ + nvkv_words, + Decoder, + UnknownKeyPolicy, // + }, +}; + +use super::fw::commands::VgpuPropertiesSchema; + +pub(super) use super::fw::commands::{ + Dbdf, + VgpuProperties, // +}; + +use super::fw::{ + GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE, + GMCAPI_CMD_QUERY_VGPU_PROPERTIES, // +}; + +/// Query the vGPU type assigned to a VF by its DBDF. +#[expect(dead_code)] +pub(super) fn query_assigned_vf_type(cmdq: &Cmdq<'_>, dbdf: Dbdf) -> Resul= t { + let request =3D u64::from(dbdf.into_raw()).to_le_bytes(); + let response =3D + cmdq.send_gmc_and_receive(GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE, = &request, 64)?; + if response.status !=3D 0 { + return Err(EIO); + } + let bytes =3D response.payload.get(..4).ok_or(ENODEV)?; + Ok(u32::from_le_bytes(bytes.try_into().map_err(|_| EINVAL)?)) +} + +/// Query and decode the firmware properties of one vGPU type. +#[expect(dead_code)] +pub(super) fn query_vgpu_properties(cmdq: &Cmdq<'_>, type_id: u32) -> Resu= lt> { + let response =3D cmdq.send_gmc_and_receive( + GMCAPI_CMD_QUERY_VGPU_PROPERTIES, + &type_id.to_le_bytes(), + 4096, + )?; + if response.status !=3D 0 { + return Err(EIO); + } + + let properties =3D decode_vgpu_properties(&response.payload)?; + if properties.type_id !=3D type_id || properties.max_instance =3D=3D 0= { + return Err(EINVAL); + } + Ok(properties) +} + +/// Decodes a byte-oriented GMC vGPU-properties response with the typed NV= KV schema. +fn decode_vgpu_properties(payload: &[u8]) -> Result> { + let words =3D nvkv_words(payload, &[])?; + let decoder =3D Decoder::new(&words, UnknownKeyPolicy::Ignore); + let mut schema =3D VgpuPropertiesSchema::default(); + let properties =3D KBox::try_init(decoder.decode(&mut schema)?, GFP_KE= RNEL)?; + Ok(properties) +} diff --git a/drivers/gpu/nova-core/vgpu/fw.rs b/drivers/gpu/nova-core/vgpu/= fw.rs new file mode 100644 index 000000000000..23097cb13121 --- /dev/null +++ b/drivers/gpu/nova-core/vgpu/fw.rs @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! vGPU firmware interface. +//! +//! Exposes command constants and communication buffer layout types from +//! raw firmware bindings. + +pub(super) mod commands; + +use crate::gsp::bindings; + +pub(super) const GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE: u32 =3D + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE; + +pub(super) const GMCAPI_CMD_QUERY_VGPU_PROPERTIES: u32 =3D + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_VGPU_PROPERTIES; diff --git a/drivers/gpu/nova-core/vgpu/fw/commands.rs b/drivers/gpu/nova-c= ore/vgpu/fw/commands.rs new file mode 100644 index 000000000000..51226bbca757 --- /dev/null +++ b/drivers/gpu/nova-core/vgpu/fw/commands.rs @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Wire types and codecs for vGPU commands. +//! +//! Defines request encoders and response schemas independently of command +//! submission and instance lifecycle operations. + +use kernel::{ + alloc::ArrayVec, + bitfield, // +}; + +use crate::gsp::nvkv::{ + nvkv_decode, + Array, + Key, + KeyId, + Required, // +}; + +bitfield! { + pub(in crate::vgpu) struct Dbdf(u32) { + 2:0 function; + 7:3 device; + 15:8 bus; + 31:16 domain; + } +} + +nvkv_decode! { + pub(in crate::vgpu) struct VgpuPropertiesSchema =3D> VgpuProperties { + // TODO: `name`/`class` required? + name: Array, + class: Array, + type_id: Required, + bar1_length: Required, + max_instance: Required, + ecc: Key, + profile_size: Required, + max_fps: Key, + num_heads: Key, + max_res_x: Key, + max_res_y: Key, + dev_id: Required, + subsystem_id: Required, + fb_length: Required, + gsp_heap_size: Required, + fb_reservation: Required, + } +} + +impl VgpuPropertiesSchema { + const TYPE_NAME_KEY: KeyId =3D 0x3100; + const CLASS_KEY: KeyId =3D 0x3101; + const TYPE_ID_KEY: KeyId =3D 0x3102; + const BAR1_LENGTH_KEY: KeyId =3D 0x3103; + const MAX_INSTANCE_KEY: KeyId =3D 0x3104; + const ECC_KEY: KeyId =3D 0x3105; + const PROFILE_SIZE_KEY: KeyId =3D 0x3106; + const MAX_FPS_KEY: KeyId =3D 0x3107; + const NUM_HEADS_KEY: KeyId =3D 0x3108; + const MAX_RES_X_KEY: KeyId =3D 0x3109; + const MAX_RES_Y_KEY: KeyId =3D 0x310A; + const DEV_ID_KEY: KeyId =3D 0x310B; + const SUBSYSTEM_ID_KEY: KeyId =3D 0x310C; + const FB_LENGTH_KEY: KeyId =3D 0x310D; + const GSP_HEAP_SIZE_KEY: KeyId =3D 0x310E; + const FB_RESERVATION_KEY: KeyId =3D 0x310F; +} + +pub(in crate::vgpu) struct VgpuProperties { + name: ArrayVec, + class: ArrayVec, + pub(in crate::vgpu) type_id: u32, + pub(in crate::vgpu) bar1_length: u64, + pub(in crate::vgpu) max_instance: u32, + ecc: u32, + profile_size: u64, + max_fps: u32, + num_heads: u32, + max_res_x: u32, + max_res_y: u32, + pub(in crate::vgpu) dev_id: u32, + pub(in crate::vgpu) subsystem_id: u32, + pub(in crate::vgpu) fb_length: u64, + pub(in crate::vgpu) gsp_heap_size: u64, + fb_reservation: u64, +} + +impl VgpuProperties { + const STRING_LEN: usize =3D 64; +} From nobody Fri Sep 25 10:37:46 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011035.outbound.protection.outlook.com [40.107.208.35]) (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 026D63F88B8 for ; Mon, 14 Sep 2026 07:52:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.35 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372361; cv=fail; b=EHCEGDUv8vpoDRFZxYtGgLag364ZKPpurZs9IYWTZWBleUjVpjIh/e6oSPD0MEB/CJnbMdXh+pvffsKFXrf6BEU0hKiBf+al9ndFc4IMhNRQNQid9Tr13vuLP24mnJF3Qkuue7KLGT2Rv/AiNRVkEm+i4aE5iExGNq8sdsVAo48= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372361; c=relaxed/simple; bh=tobCmZ/E/Kq2oZT+GUJ4jVoLUxUkj3RJqfPLbQmLY6c=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZgjdFfTOAsAY6jm7DAtW2iV1x4iCvcKIS/nUTPnf09GRpvg89xM1qk9YfhFKCx16QDLwvpCLC5W1eMups3lVQNN0J10WtFc/+DlcqgSIkec2Wzzw69/aYzoP6bbF+Q1xeXrB4b6+0JC1eQoVNf8uT6vc4B2BIdj25CpzbVoklQY= 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=mMSTUWMI; arc=fail smtp.client-ip=40.107.208.35 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="mMSTUWMI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Dq8yzW6p1h0kvdTnwrs7FKv2HDAvkrIdDEsJ2NNVv2dYMD5Qr6/aQdnV+qMwfIUSbhu9hQLLOJ4eFYK6pAiE1nSmGOf5JpF0aj29Y5dkZ1n/i6SulJNSslJr6iWO+loRSk7cASUm2B7tBQBUSLtZEkLB9xEA/H7hv7ixvCBIyUJKdbDyxpeC14fI8Ex5xihLkGNSa/d7cV2mDc87v9z2c7gnJrwSF/xirr0W4elIHyS2YjrDILDLSaS4fEPZutm1WD4O1hQlb0RG/dZmfybw6mnigEK7fQxZeICWL+zD2nBrkiZw0fp4lzgasaIlLleU3t6BCJRoh+XSmrenUaBmlg== 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=rTGPI/RcNBIjKHR3x0tlmAtBI9dwM9VS7xj9EdBLJGk=; b=ZTh9wHZMmPhheYvqAFgJ6rrDxNAFjYG5eILfZg7XhyhEJ/V+rP/4+JqpKWjv0iDYxRr/Xc/I7A+HvMYkIwNhLijm83tktgidBYS/GpEp3Z5n0EEH1nltZr0GylISPyDNbrdDJIdoqwD2OFHfhTi+obndg8qzO55LaFQFzNfhIahjXeG8MSbeNaQBromsiB/h0HrXUfhKJ9sLfkfOnFP3Jh1b6ErwxLES8fd38c3PmRcqg+3En1zPhAqTKxegKvMDCdW6eq1oii1vxsmLXTufdaqO3X9osVpkHh6t1/ZtsRF6SON6+MrJRvZIZ2zFSp4Myn7238NZR0n/4LHilROi4g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=rTGPI/RcNBIjKHR3x0tlmAtBI9dwM9VS7xj9EdBLJGk=; b=mMSTUWMI0ZhpO3ZKoCWPCfI5O0UWNuywuJFg9DETCVtjnXyIm5VkIVyrgIWVb93hUSf1eYgZ74OoHpCaZVOf8Cy3THTX1DX8vZUKKBshXZFHKQHq6VDtRaDx2rp6IygUBb1RAgXOCkTzz8pBc0UgfnF9kq/dm2MM3Rql445kvC2WyOSzUZq+5W2qfoTBt5zfC+i+p23wWBGYvsiFJgbxZ+dSjhIWmzds+TENFaZ3PsGhW5jCMZ2w4lb6QOhcCYJtHaoxPwLgGm1xfjwOBBF30az75V3O3YjzjSUg47CWVl8VQA/SfwzKiOQQ3RyeEx3IDEh6KkazKV9RSiEv0hDcsQ== Received: from BL1P223CA0009.NAMP223.PROD.OUTLOOK.COM (2603:10b6:208:2c4::14) by SAWPR12MB999270.namprd12.prod.outlook.com (2603:10b6:806:562::7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:52:33 +0000 Received: from BN1PEPF00018545.namprd05.prod.outlook.com (2603:10b6:208:2c4:cafe::26) by BL1P223CA0009.outlook.office365.com (2603:10b6:208:2c4::14) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:52:33 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018545.mail.protection.outlook.com (10.167.248.4) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:52:33 +0000 Received: from rnnvmail202.nvidia.com (10.129.68.7) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:15 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail202.nvidia.com (10.129.68.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:14 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:52:06 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 21/32] gpu: nova-core: vgpu: add instance create/destroy Date: Mon, 14 Sep 2026 10:48:56 +0300 Message-ID: <20260914074907.1399629-22-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018545:EE_|SAWPR12MB999270:EE_ X-MS-Office365-Filtering-Correlation-Id: daa9c234-67bc-4457-bdb5-08df123522c2 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|7416014|376014|23010399003|1800799024|82310400026|5023799004|11063799006|56012099006|10067099003|11062099010|22082099003|18002099003|6133799003|7136999003|3023799007; X-Microsoft-Antispam-Message-Info: L8GrUdVKGAjn3oAT/JQN0+9wzV43VxRWt5tohUkIjzq/SnszWozx007iCtGB+NyN6oYIp8FpklstbFOVsZGcHfNo9N+1StfYo7ZCvq1jJlTxaZkjd+z+mb0llgPuEtn71Fzkt0NWCX8PWAaC8CxzQvkt4Felw4K72A5C3H9xs4qaKzfiCbpWzDk/ASf8v/XZysBqjBtvEPNo7t6IUTb4kTo/rErAfzY92/KuSlEywsqJ3hC7kvo/KpATDFdrjAKic4hleYJ36W0Hgo8DXrotskdMm/qE9ob63267ykMfBN8n9Zyv/7LCFMWj3oOEqOv0GB/cPBW5et8fINhPdPVRikn6PRYh52we44AdCCzUXQvCBC5H2xnu5o2TffWO5tpFwDB6WfFoqrGcTNQlvdxC78rEh566kx9UYV9cdnQzwhb1sPjf7gIL2ZdmleFE3nHj+TZLc2gUDckicP6zq4deBvqwISlsjRInUNA4qZRXRHgkjt6RWcDLToB1C/YC/salzPnHv7GbAJ9nrK9KiHqm+D1Jfv+TLGiALS2P+6H2wwmlO9zL3twQnLfsMYX6yPhM3qwBkCGj67jhuQiBEay/LJAqrIi8VVN72J3IwkJOyXNDPsDrOcCYmhuFo7j0opaiQkLVhBKkaPnfnHpiG3dwpkGpF4qp8hd/jXbnBTafPz2EnhZdDbzOwpxqBTllq59iEV5ZF/HqA14/VoyMNEwngA== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(36860700016)(7416014)(376014)(23010399003)(1800799024)(82310400026)(5023799004)(11063799006)(56012099006)(10067099003)(11062099010)(22082099003)(18002099003)(6133799003)(7136999003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: bvKJpahGmHe1PJTBYdpObqSPKa9wspRriIyOoobuqjakYAqAzem5zahPhl53CVxeRYsV2Keflk4cRWIYXoIFGvpRxNSiQM7cWV3WOsq71bMRTrTXrPqbD+ktWz48VnxZ/BBZQShbHoSjqa6PcETEi5Xb00KRVMX63pVe36OPDMMFb1hpKggDFuSP+sqFhSVMPxKyvLM4rE9Fze/OCnx7Al8oB0AkVcnCLtBdVbS5dGvumBRuzCOXNIPSvHK04Gx0NscR2u4i448GblLZPzxI52CXrcunmVe2eWkZVxXdGNZGf1KnAWDvJ9WlYrPpwI4geaJ9wZbTDRTi/+tq5/0amkBS78EburzMMA28T4ba2LvIsYH6wb5WF6n1AkGvTbU71J7W2gjD8ND8Wsmgv9U21EiiiGJTdggrCWGQQVJbAmIElxhG9P27fnB3dAvlaiqU X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:52:33.3872 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: daa9c234-67bc-4457-bdb5-08df123522c2 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018545.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SAWPR12MB999270 Content-Type: text/plain; charset="utf-8" A vGPU instance holds the resources used by a VF. The VF must have a vGPU type assigned before instance creation. The instance lifetime is intended to follow VFIO device use: create it on open and destroy it on close. Add an instance registry to VgpuManager with creation and destruction operations. Creation reserves channel IDs and a VRAM slot according to the assigned vGPU type; destruction releases those reservations. Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gpu.rs | 12 +- drivers/gpu/nova-core/vgpu.rs | 23 ++- drivers/gpu/nova-core/vgpu/commands.rs | 1 - drivers/gpu/nova-core/vgpu/instance.rs | 225 +++++++++++++++++++++++++ 4 files changed, 247 insertions(+), 14 deletions(-) create mode 100644 drivers/gpu/nova-core/vgpu/instance.rs diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index ebf29b06a8e1..61adf412bae7 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -54,14 +54,16 @@ }, }; =20 -#[cfg_attr(not(CONFIG_KUNIT =3D "y"), expect(dead_code))] mod channel; mod hal; mod regs; =20 use self::channel::TOTAL_CHANNELS; =20 -pub(crate) use self::channel::ChannelIdPool; +pub(crate) use self::channel::{ + ChannelIdPool, + ChannelIdReservation, // +}; =20 macro_rules! define_chipset { ({ $($variant:ident =3D $value:expr),* $(,)* }) =3D> @@ -313,7 +315,7 @@ struct GspResources<'gpu> { #[pin_data] pub(crate) struct Gpu<'gpu> { spec: Spec, - vgpu: Option>, + vgpu: Option>>>, /// GSP event interrupt registration. /// /// Declared before `gsp_resources` so it is dropped first: `free_irq`= runs, waiting out any @@ -444,7 +446,7 @@ pub(crate) fn new<'a>( let info =3D &gsp_resources.boot_result.static_info; match gsp_resources.vgpu_state { VgpuState::Disabled =3D> None, - VgpuState::Enabled { .. } =3D> Some(VgpuManager::new( + VgpuState::Enabled { .. } =3D> Some(KBox::pin_init(Vgp= uManager::new( // SAFETY: `chid_pool` is initialized above at its= final pinned address. // The private manager and its pool borrow cannot = escape this `Gpu`. // Completed field drop order drops the manager be= fore the pool; on failure, @@ -453,7 +455,7 @@ pub(crate) fn new<'a>( &info.fifo_engine_list, info.vmmu_segment_size, TOTAL_CHANNELS, - )), + ), GFP_KERNEL)?), } }, =20 diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs index 0f9f5be752b5..f3e40e6de6f0 100644 --- a/drivers/gpu/nova-core/vgpu.rs +++ b/drivers/gpu/nova-core/vgpu.rs @@ -4,8 +4,10 @@ =20 use kernel::{ device, + new_mutex, pci, - prelude::*, // + prelude::*, + sync::Mutex, // }; =20 use crate::{ @@ -23,6 +25,7 @@ mod commands; mod fw; mod hal; +mod instance; mod vram; =20 /// vGPU state detected during GPU construction. @@ -88,9 +91,13 @@ fn query_state( } } =20 +use self::instance::VgpuInstances; + /// Runtime resources for an enabled vGPU boot. +#[pin_data] pub(crate) struct VgpuManager<'gpu> { - #[expect(dead_code)] + #[pin] + instances: Mutex>, chid_pool: &'gpu ChannelIdPool, vmmu_segment_size: u64, total_channels: u32, @@ -104,22 +111,22 @@ pub(crate) fn new( fifo_engine_list: &FifoEngineList, vmmu_segment_size: u64, total_channels: u32, - ) -> Self { - Self { + ) -> impl PinInit + use<'gpu> { + let fifo_engine_list =3D *fifo_engine_list; + pin_init!(Self { + instances <- new_mutex!(VgpuInstances::new(), "nova-core::vgpu= -instances"), chid_pool, vmmu_segment_size, total_channels, - fifo_engine_list: *fifo_engine_list, - } + fifo_engine_list, + }) } =20 /// Returns the VMMU segment size in bytes, or zero if GSP-RM omitted = it. - #[expect(dead_code)] const fn vmmu_segment_size(&self) -> u64 { self.vmmu_segment_size } =20 - #[expect(dead_code)] const fn total_channels(&self) -> u32 { self.total_channels } diff --git a/drivers/gpu/nova-core/vgpu/commands.rs b/drivers/gpu/nova-core= /vgpu/commands.rs index b5fa3575b1d7..bdedd7fc21ad 100644 --- a/drivers/gpu/nova-core/vgpu/commands.rs +++ b/drivers/gpu/nova-core/vgpu/commands.rs @@ -43,7 +43,6 @@ pub(super) fn query_assigned_vf_type(cmdq: &Cmdq<'_>, dbd= f: Dbdf) -> Result } =20 /// Query and decode the firmware properties of one vGPU type. -#[expect(dead_code)] pub(super) fn query_vgpu_properties(cmdq: &Cmdq<'_>, type_id: u32) -> Resu= lt> { let response =3D cmdq.send_gmc_and_receive( GMCAPI_CMD_QUERY_VGPU_PROPERTIES, diff --git a/drivers/gpu/nova-core/vgpu/instance.rs b/drivers/gpu/nova-core= /vgpu/instance.rs new file mode 100644 index 000000000000..99a8f47e72d1 --- /dev/null +++ b/drivers/gpu/nova-core/vgpu/instance.rs @@ -0,0 +1,225 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +use core::num::NonZeroUsize; + +use kernel::{ + prelude::*, + ptr::Alignment, + sizes::SizeConstants, // +}; + +use crate::gsp::cmdq::Cmdq; + +use crate::{ + gpu::ChannelIdReservation, + mm::GpuMm, // +}; + +use super::{ + vram::{ + VgpuVramLayout, + VgpuVramSlot, + VgpuVramSlotAllocator, // + }, + VgpuManager, // +}; + +use super::commands::{ + query_vgpu_properties, + Dbdf, + VgpuProperties, // +}; + +/// Guest Function ID. GFID 0 is reserved for the PF; VFs start at 1. +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq, Eq)] +pub(super) struct Gfid(pub(super) u32); + +/// Resource requirements and device identity for one vGPU type. +#[expect(dead_code)] +pub(super) struct VgpuType { + vgpu_type_id: u32, + bar1_length: u64, + max_instance: u32, + pci_dev_id: u32, + pci_subsys_id: u32, + fb_length: u64, + gsp_heap_size: u64, +} + +impl VgpuType { + fn from_properties(properties: &VgpuProperties) -> Self { + Self { + vgpu_type_id: properties.type_id, + bar1_length: properties.bar1_length, + max_instance: properties.max_instance, + pci_dev_id: properties.dev_id, + pci_subsys_id: properties.subsystem_id, + fb_length: properties.fb_length, + gsp_heap_size: properties.gsp_heap_size, + } + } +} + +/// A vGPU instance and the resources reserved for it. +#[expect(dead_code)] +pub(super) struct VgpuInstance<'gpu> { + pub(super) gfid: Gfid, + dbdf: Dbdf, + vgpu_type: VgpuType, + vm_pid: u32, + chids: ChannelIdReservation<'gpu>, + vram_slot: VgpuVramSlot, +} + +/// Identity and firmware profile used to allocate an instance. +pub(super) struct InstanceInfo { + gfid: Gfid, + dbdf: Dbdf, + vgpu_type: VgpuType, + vm_pid: u32, +} + +#[expect(dead_code)] +impl InstanceInfo { + pub(super) const fn new(gfid: Gfid, dbdf: Dbdf, vgpu_type: VgpuType, v= m_pid: u32) -> Self { + Self { + gfid, + dbdf, + vgpu_type, + vm_pid, + } + } +} + +/// Registry of live vGPU instances. +pub(super) struct VgpuInstances<'gpu> { + instances: KVec>, + vram_slots: Option, +} + +#[expect(dead_code)] +impl<'gpu> VgpuInstances<'gpu> { + pub(super) const fn new() -> Self { + Self { + instances: KVec::new(), + vram_slots: None, + } + } + + fn alloc_vram_slot(&mut self, mm: &GpuMm<'_>, layout: VgpuVramLayout) = -> Result { + let replace_empty_pool =3D match self.vram_slots.as_ref() { + Some(allocator) if allocator.is_empty() =3D> !allocator.matche= s_layout(layout)?, + _ =3D> false, + }; + if replace_empty_pool { + self.vram_slots =3D None; + } + + if let Some(allocator) =3D self.vram_slots.as_mut() { + return allocator.alloc(layout); + } + + let mut allocator =3D VgpuVramSlotAllocator::new(mm, layout)?; + let slot =3D allocator.alloc(layout)?; + self.vram_slots =3D Some(allocator); + Ok(slot) + } + + fn release_vram_slot(&mut self, slot: VgpuVramSlot) -> Result { + self.vram_slots.as_mut().ok_or(EIO)?.release(slot); + Ok(()) + } + + /// Allocate resources and register a new inactive vGPU instance. + pub(super) fn allocate_instance( + &mut self, + mm: &GpuMm<'_>, + vgpu: &VgpuManager<'gpu>, + info: InstanceInfo, + ) -> Result { + let InstanceInfo { + gfid, + dbdf, + vgpu_type, + vm_pid, + } =3D info; + + if self + .instances + .iter() + .any(|instance| instance.gfid =3D=3D gfid || instance.dbdf =3D= =3D dbdf) + { + return Err(EEXIST); + } + let profile_instances =3D self + .instances + .iter() + .filter(|instance| instance.vgpu_type.vgpu_type_id =3D=3D vgpu= _type.vgpu_type_id) + .count(); + if vgpu_type.max_instance =3D=3D 0 + || profile_instances + >=3D usize::try_from(vgpu_type.max_instance).map_err(|_| E= OVERFLOW)? + { + return Err(ENOSPC); + } + // Reserve registry capacity before acquiring resources so publish= ing + // the completed instance cannot fail due to memory pressure. + self.instances.reserve(1, GFP_KERNEL)?; + + let num_chid =3D vgpu + .total_channels() + .checked_div(vgpu_type.max_instance) + .filter(|count| *count !=3D 0) + .ok_or(EINVAL)?; + let chids =3D vgpu.chid_pool.reserve_ids( + NonZeroUsize::new(usize::try_from(num_chid).map_err(|_| EOVERF= LOW)?).ok_or(EINVAL)?, + Alignment::SZ_1, + )?; + let layout =3D VgpuVramLayout { + type_id: vgpu_type.vgpu_type_id, + max_slots: vgpu_type.max_instance, + fb_size: vgpu_type.fb_length, + heap_size: vgpu_type.gsp_heap_size, + fb_align: vgpu.vmmu_segment_size(), + }; + let vram_slot =3D self.alloc_vram_slot(mm, layout)?; + + let instance =3D VgpuInstance { + gfid, + dbdf, + vgpu_type, + vm_pid, + chids, + vram_slot, + }; + match self.instances.push_within_capacity(instance) { + Ok(()) =3D> Ok(gfid), + Err(error) =3D> { + let VgpuInstance { vram_slot, .. } =3D error.0; + self.release_vram_slot(vram_slot)?; + Err(EIO) + } + } + } + + /// Remove an instance and release its channel and VRAM reservations. + pub(super) fn destroy_instance(&mut self, gfid: Gfid) -> Result { + let index =3D self + .instances + .iter() + .position(|instance| instance.gfid =3D=3D gfid) + .ok_or(ENOENT)?; + let instance =3D self.instances.remove(index).map_err(|_| EIO)?; + let VgpuInstance { vram_slot, .. } =3D instance; + self.release_vram_slot(vram_slot) + } +} + +/// Query and decode one vGPU type using the typed NVKV schema. +#[expect(dead_code)] +pub(super) fn query_vgpu_type(cmdq: &Cmdq<'_>, type_id: u32) -> Result { + let properties =3D query_vgpu_properties(cmdq, type_id)?; + Ok(VgpuType::from_properties(&properties)) +} From nobody Fri Sep 25 10:37:46 2026 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011062.outbound.protection.outlook.com [40.93.194.62]) (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 5E2C43F2118 for ; Mon, 14 Sep 2026 07:52:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.62 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372374; cv=fail; b=kTWokjFhuSKBsO/JP5zitnVsGluc2+YzYrFGrDJkxjAlSGk5IqYgQxF4mdyPndhY1WhB5IO7a7qV3h81EP7nXAng2n46tSQYHboEoTIwDAviqSMad/mVBhctOQTEgwzkMZ1Wi7C8rqrNzxCcIgm74K5//lzjdrSZDEAJ6Uqutjg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372374; c=relaxed/simple; bh=Juu2be0TytALuLVYJ69xdYcSxkSga8PSslWwMc6gVL0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=XmtmjQo1a7ulOsVjUO14i7n6VDq1BW3p6qR/gUJNZsuOSbR3jk9g9Y2gUy7afSUgrZh7vYhcYsg7qUko940qbiYJzvpIRuMpha3+FLW5pr+9pLbT72pNMmxUK1EWC9S9YX8SaHeDTBymZ5IKBO2dVm0M24HWFXbbA7HkZB6TyXo= 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=mwf+Qc8y; arc=fail smtp.client-ip=40.93.194.62 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="mwf+Qc8y" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dtmvfhevFIf2p8DUM7tF6sQjm/moT49QO8GVvWEXob8sU9GzxT7Coil1ZzkbuPRFCkJ9Oy96Zcrzoq/5cCJK9b5SbItm3qrkjwuoIgtKhnt9bvRyIRDU1yUcQ7w4nZArVI1iKkofarnxvPfDpyKBzWChPe4PAVt17T9fXXisWCMVfiGKy1ryMDLfGed+evpIZFy+eoPuiBny6JukGK9xbn1/6dMDWFX68exWc+avmgJd+ieZ9X2eVbDN2/rUN+oqmr2ko2KJ4Uta8vKQ7uIXtRxyY4msNJ7z/Gtw7ok0TI8fnSolY5GpAeqYjk4FG/hL5jB0R06P0Wrsogo0m1l/QA== 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=KUAuoRYHOQe0DMrMbpa8M1vwwywut1zu7luM2ZZ/OxQ=; b=pblIg1JxmZADTwrJHeZreIw7s8vd+KiFdqOtqrUBL1rzLHQZF6ISK5OBb3cCgy7DuVMClHyNjwQu8dgMPEEYuGlTW5KCQQDP3aAhQGr3r0/eyqAZkonNHFhpHj9uPvui1j9hyCuQqtxRY1jYN10ROne/TSIA6oEj87QSW4UEeePDq2KrEQh3ZEcjPeCRuw6tgGiXRmozzGT0p13EDEmktEjgyEL/evroQlLMgClrVKpb1NP/ZoXC7UjypwhAdOtJGYyyU1TKaWm7VoBGverpEHgb82Qtx/v+l/CFuFztAxPoSY0+lCCC6wy/8s4RzBDNGbNon5mu5ZAOew/K+1A+1Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=KUAuoRYHOQe0DMrMbpa8M1vwwywut1zu7luM2ZZ/OxQ=; b=mwf+Qc8y1Qj11RpwrTJf0UpMbCGZmPYMHzL+GnywJbfZayybPXKytW7MW6W9D+xExwAu9kc1ruo80Bi9BBVs5wLaZhMrZ2iHW9Ov7w2oVA3VHI0TyK/0f0tTOp6268yyiTh5AOfSaIWRm1hTlcAZBsOiIJ7MKtAhBr3qwFm9USEDf3bTLos2e2mN38me0FqyFYJ7s5oSNy70hdOFFZf6deVBQN2+dqPXhKW41fer94JoFAsjhCWNHl92O98F62JyN7MOa+5gp1mngIwEeKQTshQDlrqy67PnFgNk2biz5SRjpNiaxFVZ/Mh71/5CSoa27axXpDaXYwnuCI4LWTGvJw== Received: from BN9PR03CA0900.namprd03.prod.outlook.com (2603:10b6:408:13c::35) by PH7PR12MB8106.namprd12.prod.outlook.com (2603:10b6:510:2ba::9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.11; Mon, 14 Sep 2026 07:52:44 +0000 Received: from BN1PEPF00018549.namprd05.prod.outlook.com (2603:10b6:408:13c:cafe::24) by BN9PR03CA0900.outlook.office365.com (2603:10b6:408:13c::35) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:52:43 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018549.mail.protection.outlook.com (10.167.248.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:52:43 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:23 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:22 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:52:15 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 22/32] gpu: nova-core: vgpu: encode vGPU boot requests Date: Mon, 14 Sep 2026 10:48:57 +0300 Message-ID: <20260914074907.1399629-23-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018549:EE_|PH7PR12MB8106:EE_ X-MS-Office365-Filtering-Correlation-Id: 57007c50-be4d-4544-9d4b-08df123528db X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|82310400026|36860700016|7416014|376014|1800799024|10067099003|3023799007|6133799003|18002099003|22082099003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: b6W8lc977XtE8r7aT6xSyHovS5cTQQliiwMgZDQvJGdktlMzxKlwtReK4ybCrl5sRS6f4Rr2soj7ZpK08XPwn+UaJ7Q7eRNv3ESxZfCkCh7TnkvUIQTtcnNcAlAQ5qYF2ejcNRcjE/itAO5DSZGhisa5iFQPllMzYqFta2ARqHmRfQUL6pPHOmvJTl1o8QQZL7qM3dMjkZUS7S/RIeELa92hBc1Dl04+Hc5NwJw5CRQsug0IazVYDTWCRbnpsIXjRPaOx5JY/HufOqwkQLm2ninjQl+BseWzwz0u+L85K7HYA/nypBFUOAx9ctXt9UbL1y9eutLCyJXysHeGFVgeb1bDc63Y7GOUHgkAc69ZLOq8ZjJWNyEG2huUupGUICbESg20D9cHc+M9+pMc0XQvHdcficIgTR3bFELbfZkOyQIOdWwrofrmLVuFwOjj+6iEEcGiArPxGk8ZRwkB3JO1CWQNsDjQ+5OfisdbUd4e1+mnbf1RxuX/VsD5WphEX8AoPhvfY06zPQgIT/7n18D8l9JqXvxiRJ4Yfsemr327UKbXj4NiZ3QttsQLBhBK+hH4j/i2MVYseU8c4Clnx9eLWtYSiMMHeuIbABSgQmSKrmPMyFxDRZfTo/SzDSamDEQM9oqVxz88vB1eutNdAJh4VVNcg+4ere7RUCPxOoYcxu8vEWlStnV7zvVW/QqokmdjQko20c430BSbT6buqoPcQQ== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(23010399003)(82310400026)(36860700016)(7416014)(376014)(1800799024)(10067099003)(3023799007)(6133799003)(18002099003)(22082099003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: pJuBgzdZUK7LHLNndVoaXApJ/GcrdV8L/zbEQlNKER58jZPKMTbXNgFPba09s9Z+gvsi0TsIyPbW0YCeuZBDsFe7JPaaLzRrkyUb/ijeUNtiZ9M0E3L2+uXdZOVSqdE0MLHbCE6gg5V3rSj4P1d0LnjbVorYZrEoUOex0YAo+i/dnza/59m89PW+njB0Fh9De6U1OGZIj+qVXeOrojo8xntS++Iijn0K1Mzt230FDMYjQlfPMnIA7r+UE+sxCLRBv8Wh137rEs0bbxU6ujZfkg8R3xvpSjf4iekscBAJ8hFKQCGNWlY5IaOrR1QONgnmeGTiTwsYZD9kIJnv+aAvvBTyyuyqJPbntnDbZpOrUm1Lt4VSxnc5vuJpbag4GWty+AkKjhSxI5vvHqMsk1bPULp3zcdyi7OOtihDTFqOvCLkosTVYNEoe/2a1ILzlsWt X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:52:43.6172 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 57007c50-be4d-4544-9d4b-08df123528db X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018549.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB8106 Content-Type: text/plain; charset="utf-8" The vGPU boot command describes a vGPU's channel assignment, framebuffer, plugin heap and log buffers to GSP. During vGPU instance creation, once all resources have been allocated, this command registers them with GSP-RM and boots the GSP plugin. Add the NVKV request schema and encoder, including the channel map and guest framebuffer segment arrays. Co-developed-by: Eliot Courtney Signed-off-by: Eliot Courtney Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp/nvkv.rs | 11 ++ drivers/gpu/nova-core/gsp/nvkv/encode.rs | 12 ++ drivers/gpu/nova-core/vgpu/fw/commands.rs | 163 +++++++++++++++++++++- 3 files changed, 185 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/gsp/nvkv.rs b/drivers/gpu/nova-core/gsp/= nvkv.rs index 9f2119b98b26..8d8dd4435354 100644 --- a/drivers/gpu/nova-core/gsp/nvkv.rs +++ b/drivers/gpu/nova-core/gsp/nvkv.rs @@ -168,6 +168,17 @@ pub(crate) struct Array vec: ArrayVec, } =20 +impl Array { + /// Creates an array filled from `values`. + /// + /// Fails with `EINVAL` if `values` is longer than `N`. + pub(crate) fn new(values: &[T]) -> Result { + let mut vec =3D ArrayVec::default(); + vec.extend_from_slice(values)?; + Ok(Self { vec }) + } +} + bitfield! { /// The op word that starts each NVKV operation. struct Op(u64) { diff --git a/drivers/gpu/nova-core/gsp/nvkv/encode.rs b/drivers/gpu/nova-co= re/gsp/nvkv/encode.rs index 0047be65e8a9..1f4df24d8c9c 100644 --- a/drivers/gpu/nova-core/gsp/nvkv/encode.rs +++ b/drivers/gpu/nova-core/gsp/nvkv/encode.rs @@ -6,6 +6,7 @@ use kernel::prelude::*; =20 use super::{ + Array, EncodedStream, Index, Key, @@ -145,6 +146,17 @@ fn encode(&self, encoder: &mut Encoder) -> Result { } } =20 +impl Encodable for Array +where + T: Default + Copy, + for<'a> IndexedKey<&'a [T], KEY_ID>: Encodable, +{ + #[inline(always)] + fn encode(&self, encoder: &mut Encoder) -> Result { + IndexedKey::<&[T], KEY_ID>::new(Index::new::<0>(), self.vec.as_sli= ce()).encode(encoder) + } +} + impl Encodable for Option { #[inline(always)] fn encode(&self, encoder: &mut Encoder) -> Result { diff --git a/drivers/gpu/nova-core/vgpu/fw/commands.rs b/drivers/gpu/nova-c= ore/vgpu/fw/commands.rs index 51226bbca757..3af84c584dd6 100644 --- a/drivers/gpu/nova-core/vgpu/fw/commands.rs +++ b/drivers/gpu/nova-core/vgpu/fw/commands.rs @@ -8,12 +8,18 @@ =20 use kernel::{ alloc::ArrayVec, - bitfield, // + bitfield, + prelude::*, // }; =20 use crate::gsp::nvkv::{ nvkv_decode, + nvkv_encode, Array, + Encodable, + EncodedStream, + Encoder, + Index, Key, KeyId, Required, // @@ -28,6 +34,161 @@ pub(in crate::vgpu) struct Dbdf(u32) { } } =20 +#[derive(Clone, Copy)] +struct SwizzId(u32); + +impl SwizzId { + const WHOLE_GPU: Self =3D Self(0xFFFF_FFFF); +} + +impl From for u32 { + fn from(value: SwizzId) -> Self { + value.0 + } +} + +bitfield! { + pub(in crate::vgpu) struct ChannelMapEntry(u64) { + 15:0 engine_type; + 31:16 index; + 63:32 chid_offset; + } +} + +impl ChannelMapEntry { + const KEY: KeyId =3D 0x1001; + + #[expect(dead_code)] + pub(in crate::vgpu) fn new(engine_type: usize, index: u32, chid_offset= : u32) -> Result { + Self::zeroed() + .try_with_engine_type(u64::try_from(engine_type).map_err(|_| E= OVERFLOW)?) + .and_then(|entry| entry.try_with_index(u64::from(index))) + .and_then(|entry| entry.try_with_chid_offset(u64::from(chid_of= fset))) + } +} + +impl Encodable for KVVec { + fn encode(&self, encoder: &mut Encoder) -> Result { + // SAFETY: `ChannelMapEntry` is a `bitfield!` over `u64`, i.e. + // `#[repr(transparent)]` around a `u64`, so the entries are + // layout-compatible with `u64` and can be viewed as a `u64` slice. + let slice =3D unsafe { core::slice::from_raw_parts(self.as_ptr().c= ast::(), self.len()) }; + encoder.encode_array64(ChannelMapEntry::KEY, Index::new::<0>(), sl= ice) + } +} + +bitfield! { + struct VgpuBootloadOptions(u64) { + } +} + +nvkv_encode! { + struct VgpuBootloadRequest { + dbdf: Key, + gfid: Key, + vgpu_type: Key, + vm_pid: Key, + swizz_id: Key, + num_channels: Key, + num_plugin_channels: Key, + guest_fb_segment_count: Key, + options: Key, + channel_mapping: KVVec, + guest_fb_segment_phys_addr: Array, + guest_fb_segment_length: Array, + plugin_heap_phys_addr: Key, + plugin_heap_length: Key, + ctrl_buff_offset: Key, + init_task_log_offset: Key, + init_task_log_size: Key, + vgpu_task_log_offset: Key, + vgpu_task_log_size: Key, + kernel_log_offset: Key, + kernel_log_size: Key, + mig_rm_heap_phys_addr: Key, + mig_rm_heap_length: Key, + } +} + +impl VgpuBootloadRequest { + const DBDF_KEY: KeyId =3D 0x0001; + const GFID_KEY: KeyId =3D 0x0002; + const VGPU_TYPE_KEY: KeyId =3D 0x0003; + const VM_PID_KEY: KeyId =3D 0x0004; + const SWIZZ_ID_KEY: KeyId =3D 0x0005; + const NUM_CHANNELS_KEY: KeyId =3D 0x0006; + const NUM_PLUGIN_CHANNELS_KEY: KeyId =3D 0x0007; + const GUEST_FB_SEGMENT_COUNT_KEY: KeyId =3D 0x0008; + const OPTIONS_KEY: KeyId =3D 0x1000; + const GUEST_FB_SEGMENT_PHYS_ADDR_KEY: KeyId =3D 0x1002; + const GUEST_FB_SEGMENT_LENGTH_KEY: KeyId =3D 0x1003; + const PLUGIN_HEAP_PHYS_ADDR_KEY: KeyId =3D 0x1004; + const PLUGIN_HEAP_LENGTH_KEY: KeyId =3D 0x1005; + const CTRL_BUFF_OFFSET_KEY: KeyId =3D 0x1006; + const INIT_TASK_LOG_OFFSET_KEY: KeyId =3D 0x1007; + const INIT_TASK_LOG_SIZE_KEY: KeyId =3D 0x1008; + const VGPU_TASK_LOG_OFFSET_KEY: KeyId =3D 0x1009; + const VGPU_TASK_LOG_SIZE_KEY: KeyId =3D 0x100A; + const KERNEL_LOG_OFFSET_KEY: KeyId =3D 0x100B; + const KERNEL_LOG_SIZE_KEY: KeyId =3D 0x100C; + const MIG_RM_HEAP_PHYS_ADDR_KEY: KeyId =3D 0x100D; + const MIG_RM_HEAP_LENGTH_KEY: KeyId =3D 0x100E; +} + +/// Encodes a `VGPU_BOOTLOAD` request using the typed NVKV schema. +#[expect(dead_code)] +#[expect(clippy::too_many_arguments)] +pub(in crate::vgpu) fn encode_vgpu_bootload( + dbdf: Dbdf, + gfid: u32, + vgpu_type: u32, + vm_pid: u32, + num_channels: u32, + num_plugin_channels: u32, + channel_mapping: KVVec, + guest_fb_address: u64, + guest_fb_length: u64, + plugin_heap_address: u64, + plugin_heap_length: u64, + ctrl_buffer_offset: u64, + init_log_address: u64, + init_log_size: u64, + vgpu_log_address: u64, + vgpu_log_size: u64, + kernel_log_address: u64, + kernel_log_size: u64, +) -> Result { + let request =3D VgpuBootloadRequest { + dbdf: dbdf.into(), + gfid: gfid.into(), + vgpu_type: vgpu_type.into(), + vm_pid: vm_pid.into(), + swizz_id: SwizzId::WHOLE_GPU.into(), + num_channels: num_channels.into(), + num_plugin_channels: num_plugin_channels.into(), + guest_fb_segment_count: 1.into(), + options: VgpuBootloadOptions::zeroed().into(), + channel_mapping, + guest_fb_segment_phys_addr: Array::new(&[guest_fb_address])?, + guest_fb_segment_length: Array::new(&[guest_fb_length])?, + plugin_heap_phys_addr: plugin_heap_address.into(), + plugin_heap_length: plugin_heap_length.into(), + ctrl_buff_offset: ctrl_buffer_offset.into(), + init_task_log_offset: init_log_address.into(), + init_task_log_size: init_log_size.into(), + vgpu_task_log_offset: vgpu_log_address.into(), + vgpu_task_log_size: vgpu_log_size.into(), + kernel_log_offset: kernel_log_address.into(), + kernel_log_size: kernel_log_size.into(), + mig_rm_heap_phys_addr: 0.into(), + mig_rm_heap_length: 0.into(), + }; + + let mut encoder =3D Encoder::new(); + request.encode(&mut encoder)?; + Ok(encoder.finish()) +} + nvkv_decode! { pub(in crate::vgpu) struct VgpuPropertiesSchema =3D> VgpuProperties { // TODO: `name`/`class` required? From nobody Fri Sep 25 10:37:46 2026 Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012042.outbound.protection.outlook.com [40.107.209.42]) (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 BEBE43EEAE2 for ; Mon, 14 Sep 2026 07:53:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.209.42 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372386; cv=fail; b=KvGQUY5Y3gOZs7MSAxLTxBXI9MA4xqU+YyM0NhiVznUEffGrOFQB1hi7jUtnXKKR+Ow5/88prNsbtkZsg1riOmsBJGl8+u5GjQg4+7dGG8ATjaEVod54wYrmqT6rseadDk2osbSNOZzDoLidWjZ4yublhYNyOBxMFrk61QcxBVo= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372386; c=relaxed/simple; bh=Fc553FH0QBSxhAtg0hPd5kwEgiEjQE61tXXO5WjSwSc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Yf26da6DQxSeSov6J3CzY8scJWx1ZGfvEPcyavVz34kN3CXbdyHMlAyBYpkryvFd3hM9pH8yXRYfJkF0AayBkA820h4Mow8SlLnsD7kwrnsA2JK0DpIZ5FduoTWX0qNXpKfVF9eN7HNW49PSLyUph8UcZFmM7WadxrPoToBS3bg= 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=UrRRovCj; arc=fail smtp.client-ip=40.107.209.42 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="UrRRovCj" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=OuBPYkrLI86a4uHJo+/kdJOre67Fwgd7/hCvQKGnDIslfKWM1H8XOJah31nqsQz6OZZMpAPDmXANGOuE/cqu5a4Z26xHYqW7r7SwyZQRnLMYSSnr4ZH2rXEX4MhThLHyipAe8FoUSzlm1XBzDDsiUBa0xhuvgjRYInXMekJcUkXmt7bQkOeI5Ht1NWVQFiiUhxaB17o+tDNpH7OrWgb2hn6D9Z4211/f1AgmUDDJso+Rye/bi5VCQkM/D6zZplURnEJlKG4g5rROxZjE/7x7bbvAbCqAIjcMz8caUcLln8r+GKPSWfkkK15jOcfvriwLlen0kUiwdpOYZjb1w89mgw== 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=VIrtK84VxfQ3zxDzUlxyb1aygxwXtDmcvLsxRAA6HLY=; b=VfpPX4ZdcvvOSWqK0rN9tK65i24DEiwOw3MlTE1rLc1iQe0Q7H+plgwHeB/YISZuqazS8VMKYvjPTzO8NAtzONnHZtvgvw/C43cNTVIgZW+HJgQNduFOoHBXFapW1foHhvZepjq5ejNC7rvQO+0DABW0zqaX3zIPx1RexCWtZcYh+ezuDLl55QRw2BT16hBxh+iQqNiv3Qo0tfi/ZX8Lb938os2CyGfpmdpGytSgG0VZCUAxuaUSJg7oLtYFZQT3kb/mN7f/+FiheOsOBzdrzFHYkzmAWM2etOOEuO7cq+kOsN9d1AyXoW1Ul6IOjX6cPzaWryOjY5BdSr7WXuepTQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=VIrtK84VxfQ3zxDzUlxyb1aygxwXtDmcvLsxRAA6HLY=; b=UrRRovCjxNbVKiyeYOzO2fm6fakTU5PsUI8QH1m7vkinQHL+m9L8n+hjH5hmYUfMpBqnBbvrmR6Tnd+zTb4ThJWGye4WO+uTIBGBvSiH+rgBYov/WMCYDXeRrU0DEi0arXq1tY0W6Jjz3oEdNitoh1v19C88l2LCjAJjN+W9holGUyXr1IHMWkwsQQPcTrxLvQppfGEkFV10HSm6o5E75hLHgcylcX27rVz26EjY6fuponjsWbR/fudvTn7iqdkJ/DcaWN52LyKNTWu7GsI4XpAprEgJGRcmsRAMv63zzITZGsvnHNcoPE4ffWQt2wwG/exeYvnqmjHeasAjMMJATA== Received: from BLAPR03CA0060.namprd03.prod.outlook.com (2603:10b6:208:32d::35) by PH8PR12MB7279.namprd12.prod.outlook.com (2603:10b6:510:221::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:52:55 +0000 Received: from BN1PEPF00018548.namprd05.prod.outlook.com (2603:10b6:208:32d:cafe::62) by BLAPR03CA0060.outlook.office365.com (2603:10b6:208:32d::35) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.382.15 via Frontend Transport; Mon, 14 Sep 2026 07:52:55 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018548.mail.protection.outlook.com (10.167.248.7) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:52:55 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:31 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:30 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:52:23 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 23/32] gpu: nova-core: vgpu: add GSP plugin communication buffers Date: Mon, 14 Sep 2026 10:48:58 +0300 Message-ID: <20260914074907.1399629-24-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018548:EE_|PH8PR12MB7279:EE_ X-MS-Office365-Filtering-Correlation-Id: 1127b997-4138-44bd-35e5-08df12352fe5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|7416014|376014|23010399003|1800799024|82310400026|11063799006|56012099006|10067099003|22082099003|18002099003|6133799003|3023799007; X-Microsoft-Antispam-Message-Info: CfQ435tNDFdcrzNS96JomNv3K8PAHjpVPmmQ/ii3FZON3q9wXyPOqb8VnwhYZ9220LASBrsViZ3mbqeIf1/7wcANr5fP1PIYf4btWRZl0ZD0VcZec4cFMZ8Zv21k/p+Qii+DaHFWOk1qCpWTIf0N3GcNoFQvbfMBindy8tEX/etKKysavyt2RSm3Cqi5D1QODS6axZtp5nZhO9BSp3QjcZI0zf0vUzgaEzE0gU+KfHSyoxihbJ1E0gMnmcnuqiN7GA7vIxYH4YN/gDTkl/58BTZA8KggeeRJeM2ASN7cttVJO/6/lWfl6j/nqa1oykTSXQXLI/tqNYXHXfeORUuYejhBKFWf2vXvaT7Uy8teFmMVOz5s4Yxk8Bv8/BtCGHx6SViqGRtzjo10WZAhcEEfMQWCsqvnoFesNjDzkficGsmVwlRvgst8CVZPpYkwRUvU77Q87Eo3M6ghZXesp0wld/eE9d1HMXD1wc7zg1ynmjMyDdlNlpzq2qTBVjv+dsDLMW8bHVv5tTeDrwzGAr4KM6B0YE/g1u7D/O1kjl4L278Z6nyijoht+S2Dmr3KVKrvQ/YIoJ4R2bxngUJAeHnCGPIUkHEuSW2x2LTJEDyXrzPIy+oPUkRIKzu2J0REJ/h5pYuqOd77fWkkbZ4DUL+Oi0bakkExjVLadtEXwQ5+r8ssvjWJjL2vgZ/OhXV81s1YIJrSSHFD97p3h0k75fn6kA== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(36860700016)(7416014)(376014)(23010399003)(1800799024)(82310400026)(11063799006)(56012099006)(10067099003)(22082099003)(18002099003)(6133799003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 1f3y/2OU/aUcb5KMkWUs9/ITM5gOYDNl6lgmTuvp2JyidtxSUBg4bOrB/YkzHRlhQX/LNKKLLcOx4bLABI9dfG8fi8qTOZAxN+t3qeHo2Icos/Aqcp1qakTSOQccwtZsViHVWP3qyeTJNi11GfHAOERZ/Wrn/5reYc2wRecOeA29gxaHMb9ggXnMfWbX9/K1hwQA6p7kOh14LuTNFb4Xn2Sjps5TQ/LSTIy7tkDocAXz98dWl6wMtNG5eXGrI+pUyYr9XhjFttJaIny4M2Uolz6CbeSmaqDJpF5IGqPqsg81IWVoppdHC7QTCwL26W8Qa1jGWg/2N3wCeoM1V8JiOgbLaprJrwFACaKnPPIET6SOj8wH3DnhH+9rlL06xHOfBxJSRoHTXNirBMsvOOihlqfVQSPknEwb8be88b/hRwLCnopPOvw08eFud0fX809i X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:52:55.4146 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1127b997-4138-44bd-35e5-08df12352fe5 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018548.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH8PR12MB7279 Content-Type: text/plain; charset="utf-8" The GSP plugin uses a communication region in its management heap for control data and logs. The vGPU manager reads its boot-ready marker through BAR1. Map this region with BarMapping and expose the firmware-defined control and log regions. Keep the mapping's BarUser borrow until explicit teardown. Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/mm.rs | 1 - drivers/gpu/nova-core/vgpu.rs | 1 + drivers/gpu/nova-core/vgpu/fw.rs | 15 ++ drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs | 204 ++++++++++++++++++ 4 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs diff --git a/drivers/gpu/nova-core/mm.rs b/drivers/gpu/nova-core/mm.rs index 016d99608aeb..d1cad5ad52fc 100644 --- a/drivers/gpu/nova-core/mm.rs +++ b/drivers/gpu/nova-core/mm.rs @@ -67,7 +67,6 @@ macro_rules! impl_pfn_bounded { mod regs; pub(super) mod tlb; pub(super) mod vmm; -#[expect(dead_code)] pub(crate) mod vram; =20 /// GPU Memory Manager - owns all core MM components. diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs index f3e40e6de6f0..8919322dc057 100644 --- a/drivers/gpu/nova-core/vgpu.rs +++ b/drivers/gpu/nova-core/vgpu.rs @@ -24,6 +24,7 @@ =20 mod commands; mod fw; +mod gsp_plugin_comm; mod hal; mod instance; mod vram; diff --git a/drivers/gpu/nova-core/vgpu/fw.rs b/drivers/gpu/nova-core/vgpu/= fw.rs index 23097cb13121..aabe114b55c2 100644 --- a/drivers/gpu/nova-core/vgpu/fw.rs +++ b/drivers/gpu/nova-core/vgpu/fw.rs @@ -10,6 +10,21 @@ =20 use crate::gsp::bindings; =20 +pub(super) use bindings::{ + GSP_PLUGIN_BOOTLOADED, + VGPU_CPU_GSP_COMMUNICATION_BUFF_TOTAL_SIZE, + VGPU_CPU_GSP_CTRL_BUFF_REGION as RawControlRegion, + VGPU_CPU_GSP_CTRL_BUFF_REGION_SIZE, + VGPU_CPU_GSP_ERROR_BUFF_REGION_SIZE, + VGPU_CPU_GSP_GUEST_RPC_TRACE_BUFF_REGION_SIZE, + VGPU_CPU_GSP_INIT_TASK_LOG_BUFF_REGION_SIZE, + VGPU_CPU_GSP_KERNEL_TASK_LOG_BUFF_REGION_SIZE, + VGPU_CPU_GSP_MESSAGE_BUFF_REGION_SIZE, + VGPU_CPU_GSP_MIGRATION_BUFF_REGION_SIZE, + VGPU_CPU_GSP_RESPONSE_BUFF_REGION_SIZE, + VGPU_CPU_GSP_VGPU_TASK_LOG_BUFF_REGION_SIZE, // +}; + pub(super) const GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE: u32 =3D bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE; =20 diff --git a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs b/drivers/gpu/no= va-core/vgpu/gsp_plugin_comm.rs new file mode 100644 index 000000000000..d2139309b6be --- /dev/null +++ b/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs @@ -0,0 +1,204 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! GSP plugin communication buffer mappings and access. + +use kernel::prelude::*; + +use crate::mm::{ + bar_user::{ + BarMapping, + BarUser, // + }, + vram::VramRegion, + GpuMm, // +}; + +use super::fw::{ + self, + RawControlRegion, // +}; + +/// Physical VRAM regions containing the vGPU plugin logs. +pub(super) struct PluginLogRegions { + init: VramRegion, + vgpu: VramRegion, + kernel: VramRegion, +} + +#[expect(dead_code)] +impl PluginLogRegions { + pub(super) const fn init(&self) -> &VramRegion { + &self.init + } + + pub(super) const fn vgpu(&self) -> &VramRegion { + &self.vgpu + } + + pub(super) const fn kernel(&self) -> &VramRegion { + &self.kernel + } +} + +fn take_region(region: &VramRegion, cursor: &mut u64, size: u32) -> Result= { + let end =3D cursor.checked_add(u64::from(size)).ok_or(EOVERFLOW)?; + let subregion =3D region.subregion(*cursor..end)?; + *cursor =3D end; + Ok(subregion) +} + +/// BAR1 mapping of the plugin communication region in its management heap. +/// +/// r000 layout, with byte offsets from the management heap (not to scale): +/// +/// ```text +/// 0x000000 +----------------------------------------+ +/// | Control (boot-ready marker) 4 KiB | +/// 0x001000 +----------------------------------------+ +/// | Response 4 KiB | +/// 0x002000 +----------------------------------------+ +/// | Message 4 KiB | +/// 0x003000 +----------------------------------------+ +/// | Migration 2 MiB | +/// 0x203000 +----------------------------------------+ +/// | Error 4 KiB | +/// 0x204000 +----------------------------------------+ +/// | Init task log 128 KiB | +/// 0x224000 +----------------------------------------+ +/// | vGPU task log 256 KiB | +/// 0x264000 +----------------------------------------+ +/// | Kernel task log 64 KiB | +/// 0x274000 +----------------------------------------+ +/// | Guest RPC trace 64 KiB | +/// 0x284000 +----------------------------------------+ +/// ``` +pub(super) struct CommBufferRegion<'map, 'gpu> { + map: BarMapping<'map, 'gpu>, + control: VramRegion, + init_log: VramRegion, + vgpu_log: VramRegion, + kernel_log: VramRegion, +} + +#[expect(dead_code)] +impl<'map, 'gpu> CommBufferRegion<'map, 'gpu> { + /// Map the communication portion of a plugin management heap. + pub(super) fn new( + bar_user: &'map BarUser<'gpu>, + mm: &mut GpuMm<'_>, + management_heap: &VramRegion, + ) -> Result { + let total_size =3D u64::from(fw::VGPU_CPU_GSP_COMMUNICATION_BUFF_T= OTAL_SIZE); + let region =3D management_heap.subregion(0..total_size)?; + let mut cursor =3D 0; + + let control =3D take_region(®ion, &mut cursor, fw::VGPU_CPU_GSP= _CTRL_BUFF_REGION_SIZE)?; + take_region( + ®ion, + &mut cursor, + fw::VGPU_CPU_GSP_RESPONSE_BUFF_REGION_SIZE, + )?; + take_region( + ®ion, + &mut cursor, + fw::VGPU_CPU_GSP_MESSAGE_BUFF_REGION_SIZE, + )?; + take_region( + ®ion, + &mut cursor, + fw::VGPU_CPU_GSP_MIGRATION_BUFF_REGION_SIZE, + )?; + take_region( + ®ion, + &mut cursor, + fw::VGPU_CPU_GSP_ERROR_BUFF_REGION_SIZE, + )?; + let init_log =3D take_region( + ®ion, + &mut cursor, + fw::VGPU_CPU_GSP_INIT_TASK_LOG_BUFF_REGION_SIZE, + )?; + let vgpu_log =3D take_region( + ®ion, + &mut cursor, + fw::VGPU_CPU_GSP_VGPU_TASK_LOG_BUFF_REGION_SIZE, + )?; + let kernel_log =3D take_region( + ®ion, + &mut cursor, + fw::VGPU_CPU_GSP_KERNEL_TASK_LOG_BUFF_REGION_SIZE, + )?; + take_region( + ®ion, + &mut cursor, + fw::VGPU_CPU_GSP_GUEST_RPC_TRACE_BUFF_REGION_SIZE, + )?; + + if cursor !=3D total_size || control.size() !=3D u64::try_from(siz= e_of::())? { + return Err(EINVAL); + } + + let map =3D BarMapping::new(bar_user, mm, region, true)?; + + Ok(Self { + map, + control, + init_log, + vgpu_log, + kernel_log, + }) + } + + fn region_offset(&self, region: &VramRegion) -> Result { + let offset =3D region + .address() + .checked_sub(self.map.region().address()) + .ok_or(EINVAL)?; + if offset.checked_add(region.size()).ok_or(EOVERFLOW)? > self.map.= region().size() { + return Err(EINVAL); + } + + usize::try_from(offset).map_err(|_| EOVERFLOW) + } + + fn io_offset(&self, region: &VramRegion, field: usize, width: usize) -= > Result { + let field_end =3D field.checked_add(width).ok_or(EOVERFLOW)?; + if u64::try_from(field_end).map_err(|_| EOVERFLOW)? > region.size(= ) { + return Err(EINVAL); + } + + self.region_offset(region)? + .checked_add(field) + .ok_or(EOVERFLOW) + } + + fn read_u32(&self, region: &VramRegion, field: usize) -> Result { + self.map + .try_read32(self.io_offset(region, field, size_of::())?) + } + + /// Return the physical regions occupied by the three plugin logs. + pub(super) fn plugin_logs(&self) -> PluginLogRegions { + PluginLogRegions { + init: self.init_log.clone(), + vgpu: self.vgpu_log.clone(), + kernel: self.kernel_log.clone(), + } + } + + /// Return whether firmware has published the plugin boot marker. + pub(super) fn is_plugin_ready(&self) -> Result { + let value =3D self.read_u32( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.messa= ge_seq_num), + )?; + + Ok(value =3D=3D fw::GSP_PLUGIN_BOOTLOADED) + } + + /// Invalidate the PTEs and release the communication mapping. + pub(super) fn destroy(self, mm: &mut GpuMm<'_>) -> Result { + self.map.destroy(mm) + } +} From nobody Fri Sep 25 10:37:46 2026 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011028.outbound.protection.outlook.com [40.93.194.28]) (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 4D9BC3F788A for ; Mon, 14 Sep 2026 07:53:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.28 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372394; cv=fail; b=bSn714UloUOItbo7WUJM/arpakKcmfIJiSEMNV3zXIei36vgwVJ1r6V2yvuYH18IJ0nhqRzckhgVRH2lmN+kiajghNI1pc8CMMRQaPazpgXtuQwRquO/1tsbKpjqQKpw992HPEPkMB/beOIev+FyxUbtZeiCOUHktfTeO8WXdrM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372394; c=relaxed/simple; bh=RbyB7KoldSjxTYtceuHFnM9CSiEO/9KBzYYdSRFU9jQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZhfqYoYJtpom18uAEwzOCEPtCHSSJQAfslNjpbhtV5jaVgcHu26AihWEUz7sf6iV+nq6uH8lhH+jxbmwUC/3FjNVd4zIT5npuE6jDziicz2X93X1YtuaKkxp6IoQaW/lrhncwXHoCxW8qnMBurUWAyofJKD24VGVULrjt2BVq7c= 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=OgG1ZkOk; arc=fail smtp.client-ip=40.93.194.28 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="OgG1ZkOk" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZEQXO825vdc8Zcz2t1EnLmtmNxaPa2G+WDGwiG3RuzEdl8xzO0BNwrOOGbnitDFIlStgicoZGfpLiK/VOhyO70XNwtfHybDo7uCLUF9w54yzBeeu+vP4WxnFcY+RODqFr0VAQrcUigHzqVOUQduAHV+B9Eehpb5nUiGg79m8vj59OQen6sz9C12KzfaA83JPPQBiiXBYS9ZeBH7yCxJtvQqOPmtzvhBu7/x6faRsT8RNMTSLkOwmruiQQ1BlDyFR4jOJay+HaHhb7O1fur3jfBIjHeky5bLe2N1zbhyn+UbcyOOqOXt0iQDNaqEsm/tPNcYl50QLSfZwC4xeP/VfCA== 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=lpixQe/cGf1djTNpqbGghcVYkVb7A2gVkQa2Vc/4qZQ=; b=PCSfSbq02hSaVih5YavXjg6ZiZjHjMUQAktmMscggGO1+9aS36qtUsZr6m/zysAFLLWQKrjUxWzSDf0k23iLGi3Aax5SrPfCyPs1o+YidMP0fKjZ79D34dl64dKOB98TPS6zUCgfkvCjbsgthtQcbyOCKtaWuvSpoF25PguWcSDgiRzkNcSJC23sPW8UisYfDg56/mv0IFQZmhpuUcpO7FAU83EvNPtRowJ52I4wJt2PGR+QKfH7L0bnJFHNQwzv0b8GnF2r8iRtTXjhG/mqlXnSy1Zq0hgb9D1B8uqqmR4oK04Ye2PuQC94BJsdhw2wWJJGRn8KNvRVcOYRFVhNsA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=lpixQe/cGf1djTNpqbGghcVYkVb7A2gVkQa2Vc/4qZQ=; b=OgG1ZkOkm4myOatOxBdA1JTF9u0r9nNy7gCZthNJEHL0eI+nRsDTV5CEzLz9GhxVsmcWyf0UrqtrR+TEDyNYMVlfRfuqMlTKG/YlZiZOWzZlYIWgY9h4aNqDvP/ljs+zgtp52cjTfF68TIXvyQ8ef7XMVOLSE0/Ww782N9berBBKq/1Rt7SDbHtx3gHAyp0tjsFgPa78hKX9Xtv/UEW3pSgDnrdLpMo8Lz4Ue466qG71Fk1JQSmqVB8DJw2IUPFJXQYFptMBr6cliufo/vCnBS0dTm6VGpkVI/jHPPY4ef2p3755nwcFjP16FZgjavJ9ZWLCWbAvJbMD6OdROalQcQ== Received: from CH0P220CA0014.NAMP220.PROD.OUTLOOK.COM (2603:10b6:610:ef::29) by DM4PR12MB6134.namprd12.prod.outlook.com (2603:10b6:8:ad::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:53:01 +0000 Received: from BN2PEPF0000A891.namprd04.prod.outlook.com (2603:10b6:610:ef:cafe::77) by CH0P220CA0014.outlook.office365.com (2603:10b6:610:ef::29) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:53:01 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF0000A891.mail.protection.outlook.com (10.167.248.183) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:53:01 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:52:39 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:39 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:52:31 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 24/32] gpu: nova-core: vgpu: add instance boot and shutdown Date: Mon, 14 Sep 2026 10:48:59 +0300 Message-ID: <20260914074907.1399629-25-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000A891:EE_|DM4PR12MB6134:EE_ X-MS-Office365-Filtering-Correlation-Id: 9e51a9d8-9fcd-4e33-f95a-08df12353394 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|1800799024|82310400026|36860700016|7416014|376014|11063799006|56012099006|3023799007|10067099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: IDIk+FBqEYAY3maV849WrPkZImlkWn7alzR6L02dRXXYRwUmWIQHZElsm9c147CWPewg10VBFqbS8498IPNjzH6g5PfAhAJ7z4O6gRNMghc1xWbBW7ji+5xFqf7NcTmc/+5qFlGMUkHm/mg5Lg3pGK6u1PIapIWwabVieWRRg7KBprEG2qrFA0tAynQe5MRw1qzLx4Hqxmb1QVmBP6SQmzrbnyQ98ZRhHi+8/329k8izpiz+WmIFv1FwSOimo3IbbHnMZlAWxR9UE7Vll4pQHkaDKHQRbz1LIPmhsThClULN3nRCViLQd90Ev7ERoN4LeC4Udzb5IveoQs07mHH6j8IxxVdkL70nHMmr/RypSSmCMEvrOgDG8uCbP0EqwKH3T+4gqiGhmzccF7Yddq844vHxI7uFAjwoB2N0qkeUVnBxSbhLFENKbKcOWg3rRtsXeGOadPkWmzLRU1BauaysfLlQhDUTBdl6QoNf+UvKw5DoFZGwHJekb1AhMbH5Xlt4mZXNk746EjkJ5TFC5RYE2IE6a+aFVYRD+9ETwvR0MfIQupfz50HoR9Uzu1Nf31sAUC3vunp+dIHy6yDDMIiPikUFhhZviMejfQfrTtLFfIDavcEYCTRaRQSl8tywfGfAmZdDSWtT5k7k+PJ+2hPohNqaRaeZVw552i23i5g8gmxCE66SdugsT7bfTLFsCfRzxRPEzdQVFCRUaftYpRoT1g== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(23010399003)(1800799024)(82310400026)(36860700016)(7416014)(376014)(11063799006)(56012099006)(3023799007)(10067099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: HZ6g53M4b55UXXY5auo9LlqsYOQ4UyhH/8PnuMIb2wXeyZELIG41l3RPvux4uXRYNTSMCQWcUu9Il0T87eHmyEuW9dOfhAaw/61GucxaHRw5uNPcqdtagtf5umKmD0CMqslZztOu0doZT9lCTVdusSYzgQhs7g3LkH3HHTTm7MbrqYImlAIW+dB/kCRoJ6ZJJqWCqtQVIgnAmna0s/WGASKcnaEAN639Y/h8cmgKn93q7JoDepIglm6yOjKzE3qOE3RW6vt6OTR8ua6NIxyndI3sqYKjd6c8n1iTLd+j43cNdR8hBHuNi2pOC28k6YACEytzHyKUkxWT5GcHqNyrDtVGRK4UJFfeOGQE3z0OqzcHMf/aB7bCE7C4LvGk0FM/gqoJJvgcmYrUxrIADJotWi5w/qE0+Uv9Vb4GU3iGZfK4W7aSEXH7jZTjQCk5zysz X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:53:01.5954 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 9e51a9d8-9fcd-4e33-f95a-08df12353394 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000A891.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB6134 Content-Type: text/plain; charset="utf-8" Once a vGPU instance has been allocated, the boot command registers all its resources with the GSP-RM and GSP plugin, and starts the plugin. During vGPU shutdown, SHUTDOWN stops the plugin before the instance's resources are released. Start the GSP plugin with the instance's channel map, framebuffer, management heap and log regions. Clear a reused slot's ready marker before boot and wait for the plugin to publish a new one. Wait for SHUTDOWN completion and CLEANUP before unmapping the communication buffer and returning the channel and VRAM reservations. Co-developed-by: Alok Kumar Signed-off-by: Alok Kumar Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp/cmdq.rs | 2 - drivers/gpu/nova-core/gsp/commands.rs | 1 - drivers/gpu/nova-core/vgpu/commands.rs | 80 +++++++- drivers/gpu/nova-core/vgpu/fw.rs | 12 ++ drivers/gpu/nova-core/vgpu/fw/commands.rs | 2 - drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs | 15 +- drivers/gpu/nova-core/vgpu/instance.rs | 194 +++++++++++++++++- 7 files changed, 287 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/nova-core/gsp/cmdq.rs b/drivers/gpu/nova-core/gsp/= cmdq.rs index f4a0c8671bc8..62b97a43fefd 100644 --- a/drivers/gpu/nova-core/gsp/cmdq.rs +++ b/drivers/gpu/nova-core/gsp/cmdq.rs @@ -734,7 +734,6 @@ pub(crate) fn send_gmc_and_receive_timeout( } =20 /// Sends a synchronous GMC command and checks its status-only reply. - #[expect(dead_code)] pub(crate) fn send_gmc_and_check_status(&self, command_id: u32, payloa= d: &[u8]) -> Result { let response =3D self.send_gmc_and_receive(command_id, payload, 0)= ?; if response.status =3D=3D 0 { @@ -753,7 +752,6 @@ pub(crate) fn send_gmc_and_check_status(&self, command_= id: u32, payload: &[u8]) /// /// Both callbacks run with the queue locked and must not reenter this= queue or reset it. /// Their second argument is the raw `max_resp_or_status` word of the = event header. - #[expect(dead_code)] pub(crate) fn send_gmc_and_wait_event( &self, command_id: u32, diff --git a/drivers/gpu/nova-core/gsp/commands.rs b/drivers/gpu/nova-core/= gsp/commands.rs index 7945a191bd08..769ff6aea748 100644 --- a/drivers/gpu/nova-core/gsp/commands.rs +++ b/drivers/gpu/nova-core/gsp/commands.rs @@ -60,7 +60,6 @@ pub(crate) struct FifoEngineList { } =20 impl FifoEngineList { - #[expect(dead_code)] pub(crate) fn gmc_ids(&self) -> &[u32] { // PANIC: The type invariant bounds `count` by the array capacity. &self.gmc_ids[..self.count] diff --git a/drivers/gpu/nova-core/vgpu/commands.rs b/drivers/gpu/nova-core= /vgpu/commands.rs index bdedd7fc21ad..a2df36b901a8 100644 --- a/drivers/gpu/nova-core/vgpu/commands.rs +++ b/drivers/gpu/nova-core/vgpu/commands.rs @@ -6,7 +6,12 @@ //! Sends requests, checks responses and coordinates the firmware command //! sequences used by instance lifecycle operations. =20 -use kernel::prelude::*; +use kernel::{ + device, + prelude::*, + time::Delta, + transmute::AsBytes, // +}; =20 use crate::gsp::{ cmdq::Cmdq, @@ -17,6 +22,8 @@ }, }; =20 +use super::instance::Gfid; + use super::fw::commands::VgpuPropertiesSchema; =20 pub(super) use super::fw::commands::{ @@ -25,8 +32,12 @@ }; =20 use super::fw::{ + GMCAPI_CMD_BOOTLOAD_GSP_VGPU_PLUGIN_TASK, + GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_RESOURCES, GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE, - GMCAPI_CMD_QUERY_VGPU_PROPERTIES, // + GMCAPI_CMD_QUERY_VGPU_PROPERTIES, + GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK, + GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_COMPLETE, // }; =20 /// Query the vGPU type assigned to a VF by its DBDF. @@ -68,3 +79,68 @@ fn decode_vgpu_properties(payload: &[u8]) -> Result> { let properties =3D KBox::try_init(decoder.decode(&mut schema)?, GFP_KE= RNEL)?; Ok(properties) } + +/// Send BOOTLOAD and check its firmware status. +pub(super) fn send_bootload(cmdq: &Cmdq<'_>, payload: &[u64]) -> Result { + let response =3D cmdq.send_gmc_and_receive_timeout( + GMCAPI_CMD_BOOTLOAD_GSP_VGPU_PLUGIN_TASK, + AsBytes::as_bytes(payload), + 0, + Delta::from_secs(10), + )?; + if response.status !=3D 0 { + return Err(EIO); + } + Ok(()) +} + +/// Shut down a vGPU plugin task and wait for its completion event. +pub(super) fn send_shutdown( + dev: &device::Device, + cmdq: &Cmdq<'_>, + gfid: Gfid, +) -> Result { + let payload =3D gfid.0.to_le_bytes(); + + cmdq.send_gmc_and_wait_event( + GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK, + &payload, + Delta::from_secs(10), + |command_id, _max_response_size, _sequence, payload_0, payload_1| { + if command_id !=3D GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_CO= MPLETE + || !payload + .iter() + .copied() + .eq(Iterator::chain(payload_0.iter(), payload_1.iter()) + .take(payload.len()) + .copied()) + { + return Ok(false); + } + Ok(true) + }, + |command_id, _max_response_size, _sequence, _payload_0, _payload_1= | { + dev_dbg!( + dev, + "shutdown: ignoring unrelated event command=3D{:#x}\n", + command_id, + ); + Ok(()) + }, + )?; + Ok(()) +} + +/// Release firmware resources after a plugin task has stopped. +pub(super) fn send_cleanup( + dev: &device::Device, + cmdq: &Cmdq<'_>, + gfid: Gfid, +) -> Result { + cmdq.send_gmc_and_check_status( + GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_RESOURCES, + &gfid.0.to_le_bytes(), + )?; + dev_dbg!(dev, "cleanup: gfid=3D{} done\n", gfid.0); + Ok(()) +} diff --git a/drivers/gpu/nova-core/vgpu/fw.rs b/drivers/gpu/nova-core/vgpu/= fw.rs index aabe114b55c2..1528cc56ce74 100644 --- a/drivers/gpu/nova-core/vgpu/fw.rs +++ b/drivers/gpu/nova-core/vgpu/fw.rs @@ -30,3 +30,15 @@ =20 pub(super) const GMCAPI_CMD_QUERY_VGPU_PROPERTIES: u32 =3D bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_VGPU_PROPERTIES; + +pub(super) const GMCAPI_CMD_BOOTLOAD_GSP_VGPU_PLUGIN_TASK: u32 =3D + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_BOOTLOAD_GSP_VGPU_PLUGIN_TASK; + +pub(super) const GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK: u32 =3D + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK; + +pub(super) const GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_COMPLETE: u32 = =3D + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_COM= PLETE; + +pub(super) const GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_RESOURCES: u32 =3D + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_RESOURCES; diff --git a/drivers/gpu/nova-core/vgpu/fw/commands.rs b/drivers/gpu/nova-c= ore/vgpu/fw/commands.rs index 3af84c584dd6..2e6518e2460b 100644 --- a/drivers/gpu/nova-core/vgpu/fw/commands.rs +++ b/drivers/gpu/nova-core/vgpu/fw/commands.rs @@ -58,7 +58,6 @@ pub(in crate::vgpu) struct ChannelMapEntry(u64) { impl ChannelMapEntry { const KEY: KeyId =3D 0x1001; =20 - #[expect(dead_code)] pub(in crate::vgpu) fn new(engine_type: usize, index: u32, chid_offset= : u32) -> Result { Self::zeroed() .try_with_engine_type(u64::try_from(engine_type).map_err(|_| E= OVERFLOW)?) @@ -136,7 +135,6 @@ impl VgpuBootloadRequest { } =20 /// Encodes a `VGPU_BOOTLOAD` request using the typed NVKV schema. -#[expect(dead_code)] #[expect(clippy::too_many_arguments)] pub(in crate::vgpu) fn encode_vgpu_bootload( dbdf: Dbdf, diff --git a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs b/drivers/gpu/no= va-core/vgpu/gsp_plugin_comm.rs index d2139309b6be..af7a396021bc 100644 --- a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs +++ b/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs @@ -26,7 +26,6 @@ pub(super) struct PluginLogRegions { kernel: VramRegion, } =20 -#[expect(dead_code)] impl PluginLogRegions { pub(super) const fn init(&self) -> &VramRegion { &self.init @@ -81,7 +80,6 @@ pub(super) struct CommBufferRegion<'map, 'gpu> { kernel_log: VramRegion, } =20 -#[expect(dead_code)] impl<'map, 'gpu> CommBufferRegion<'map, 'gpu> { /// Map the communication portion of a plugin management heap. pub(super) fn new( @@ -187,6 +185,19 @@ pub(super) fn plugin_logs(&self) -> PluginLogRegions { } } =20 + /// Clear a previous boot marker before starting the plugin. + pub(super) fn clear_plugin_ready(&self) -> Result { + let offset =3D self.io_offset( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.messa= ge_seq_num), + size_of::(), + )?; + self.map.try_write32(0, offset)?; + // Complete the posted clear before firmware can publish its new m= arker. + self.map.try_read32(offset)?; + Ok(()) + } + /// Return whether firmware has published the plugin boot marker. pub(super) fn is_plugin_ready(&self) -> Result { let value =3D self.read_u32( diff --git a/drivers/gpu/nova-core/vgpu/instance.rs b/drivers/gpu/nova-core= /vgpu/instance.rs index 99a8f47e72d1..535e5ab7c2ad 100644 --- a/drivers/gpu/nova-core/vgpu/instance.rs +++ b/drivers/gpu/nova-core/vgpu/instance.rs @@ -4,19 +4,33 @@ use core::num::NonZeroUsize; =20 use kernel::{ + device, prelude::*, ptr::Alignment, sizes::SizeConstants, // + time::{ + delay::fsleep, + Delta, + Instant, + Monotonic, // + }, }; =20 -use crate::gsp::cmdq::Cmdq; +use crate::gsp::{ + cmdq::Cmdq, + commands::FifoEngineList, // +}; =20 use crate::{ gpu::ChannelIdReservation, - mm::GpuMm, // + mm::{ + bar_user::BarUser, + GpuMm, // + }, }; =20 use super::{ + gsp_plugin_comm::CommBufferRegion, vram::{ VgpuVramLayout, VgpuVramSlot, @@ -27,10 +41,56 @@ =20 use super::commands::{ query_vgpu_properties, + send_bootload, + send_cleanup, + send_shutdown, Dbdf, VgpuProperties, // }; =20 +use super::fw::commands::{ + encode_vgpu_bootload, + ChannelMapEntry, // +}; + +/// Ready limit used by `vmiopd_negotiate_cpu_gsp_version()` for the same = marker. +const PLUGIN_READY_TIMEOUT: Delta =3D Delta::from_secs(10); + +/// Build the typed channel mapping from the GSP FIFO engine list. +fn channel_mapping( + fifo_engine_list: &FifoEngineList, + chid_offset: u32, +) -> Result> { + let mut mapping =3D KVVec::new(); + for &gmc_id in fifo_engine_list.gmc_ids() { + let engine_type =3D (gmc_id & 0xffff) as usize; + let index =3D gmc_id >> 16; + mapping.push( + ChannelMapEntry::new(engine_type, index, chid_offset)?, + GFP_KERNEL, + )?; + } + Ok(mapping) +} + +fn wait_plugin_ready( + dev: &device::Device, + comm: &CommBufferRegion<'_, '_>, +) -> Result { + let start =3D Instant::::now(); + + loop { + if comm.is_plugin_ready()? { + dev_dbg!(dev, "vGPU plugin ready after {:?}\n", start.elapsed(= )); + return Ok(()); + } + if start.elapsed() >=3D PLUGIN_READY_TIMEOUT { + return Err(ETIMEDOUT); + } + fsleep(Delta::from_millis(1)); + } +} + /// Guest Function ID. GFID 0 is reserved for the PF; VFs start at 1. #[repr(transparent)] #[derive(Clone, Copy, PartialEq, Eq)] @@ -49,6 +109,10 @@ pub(super) struct VgpuType { } =20 impl VgpuType { + pub(super) const fn vgpu_type_id(&self) -> u32 { + self.vgpu_type_id + } + fn from_properties(properties: &VgpuProperties) -> Self { Self { vgpu_type_id: properties.type_id, @@ -63,14 +127,79 @@ fn from_properties(properties: &VgpuProperties) -> Sel= f { } =20 /// A vGPU instance and the resources reserved for it. -#[expect(dead_code)] pub(super) struct VgpuInstance<'gpu> { pub(super) gfid: Gfid, dbdf: Dbdf, vgpu_type: VgpuType, vm_pid: u32, chids: ChannelIdReservation<'gpu>, + num_plugin_channels: u32, vram_slot: VgpuVramSlot, + comm: CommBufferRegion<'gpu, 'gpu>, + needs_teardown: bool, +} + +impl VgpuInstance<'_> { + /// Bootload the GSP vGPU plugin and wait for its BAR1 ready indicatio= n. + fn bootload( + &mut self, + dev: &device::Device, + cmdq: &Cmdq<'_>, + fifo_engine_list: &FifoEngineList, + ) -> Result { + let fb =3D &self.vram_slot.fbmem; + let mgmt =3D &self.vram_slot.mgmt_heap; + let logs =3D self.comm.plugin_logs(); + + let payload =3D encode_vgpu_bootload( + self.dbdf, + self.gfid.0, + self.vgpu_type.vgpu_type_id(), + self.vm_pid, + u32::try_from(self.chids.len()).map_err(|_| EOVERFLOW)?, + self.num_plugin_channels, + channel_mapping( + fifo_engine_list, + u32::try_from(self.chids.start).map_err(|_| EOVERFLOW)?, + )?, + fb.address(), + fb.size(), + mgmt.address(), + mgmt.size(), + 0, + logs.init().address(), + logs.init().size(), + logs.vgpu().address(), + logs.vgpu().size(), + logs.kernel().address(), + logs.kernel().size(), + )?; + + dev_dbg!( + dev, + "bootload: gfid=3D{} sending {} typed NVKV bytes\n", + self.gfid.0, + payload.len() * size_of::(), + ); + + self.comm.clear_plugin_ready()?; + self.needs_teardown =3D true; + send_bootload(cmdq, &payload)?; + + wait_plugin_ready(dev, &self.comm)?; + + dev_dbg!(dev, "bootload: gfid=3D{} plugin ready\n", self.gfid.0); + Ok(()) + } + + /// Stop the plugin when firmware may own instance resources. + fn shutdown(&mut self, dev: &device::Device, cmdq: &Cmd= q<'_>) -> Result { + if self.needs_teardown { + send_shutdown(dev, cmdq, self.gfid)?; + dev_dbg!(dev, "shutdown: gfid=3D{} stopped\n", self.gfid.0); + } + Ok(()) + } } =20 /// Identity and firmware profile used to allocate an instance. @@ -132,10 +261,20 @@ fn release_vram_slot(&mut self, slot: VgpuVramSlot) -= > Result { Ok(()) } =20 + fn release_instance(&mut self, instance: VgpuInstance<'gpu>, mm: &mut = GpuMm<'_>) -> Result { + let VgpuInstance { + comm, vram_slot, .. + } =3D instance; + let result =3D comm.destroy(mm); + self.release_vram_slot(vram_slot)?; + result + } + /// Allocate resources and register a new inactive vGPU instance. pub(super) fn allocate_instance( &mut self, - mm: &GpuMm<'_>, + bar_user: &'gpu BarUser<'gpu>, + mm: &mut GpuMm<'_>, vgpu: &VgpuManager<'gpu>, info: InstanceInfo, ) -> Result { @@ -185,6 +324,13 @@ pub(super) fn allocate_instance( fb_align: vgpu.vmmu_segment_size(), }; let vram_slot =3D self.alloc_vram_slot(mm, layout)?; + let comm =3D match CommBufferRegion::new(bar_user, mm, &vram_slot.= mgmt_heap) { + Ok(comm) =3D> comm, + Err(error) =3D> { + self.release_vram_slot(vram_slot)?; + return Err(error); + } + }; =20 let instance =3D VgpuInstance { gfid, @@ -192,28 +338,56 @@ pub(super) fn allocate_instance( vgpu_type, vm_pid, chids, + num_plugin_channels: 3, vram_slot, + comm, + needs_teardown: false, }; match self.instances.push_within_capacity(instance) { Ok(()) =3D> Ok(gfid), Err(error) =3D> { - let VgpuInstance { vram_slot, .. } =3D error.0; - self.release_vram_slot(vram_slot)?; + self.release_instance(error.0, mm)?; Err(EIO) } } } =20 - /// Remove an instance and release its channel and VRAM reservations. - pub(super) fn destroy_instance(&mut self, gfid: Gfid) -> Result { + /// Bootload the GSP plugin for a registered instance. + pub(super) fn activate_instance( + &mut self, + dev: &device::Device, + cmdq: &Cmdq<'_>, + gfid: Gfid, + fifo_engine_list: &FifoEngineList, + ) -> Result { + let instance =3D self + .instances + .iter_mut() + .find(|instance| instance.gfid =3D=3D gfid) + .ok_or(ENOENT)?; + instance.bootload(dev, cmdq, fifo_engine_list) + } + + /// Stop the plugin and release the instance's firmware and host resou= rces. + pub(super) fn destroy_instance( + &mut self, + dev: &device::Device, + cmdq: &Cmdq<'_>, + mm: &mut GpuMm<'_>, + gfid: Gfid, + ) -> Result { let index =3D self .instances .iter() .position(|instance| instance.gfid =3D=3D gfid) .ok_or(ENOENT)?; + let instance =3D &mut self.instances[index]; + instance.shutdown(dev, cmdq)?; + if instance.needs_teardown { + send_cleanup(dev, cmdq, gfid)?; + } let instance =3D self.instances.remove(index).map_err(|_| EIO)?; - let VgpuInstance { vram_slot, .. } =3D instance; - self.release_vram_slot(vram_slot) + self.release_instance(instance, mm) } } From nobody Fri Sep 25 10:37:46 2026 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010023.outbound.protection.outlook.com [52.101.85.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A9951409632 for ; Mon, 14 Sep 2026 07:53:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.23 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372400; cv=fail; b=eQV2KcWFmCmtXxIthFzKGzJRos7NCNbCtdrljx2xLK/IcDiDEke6q1+tx4CJhPys61d/bGKbh1gpnDKwsy1LhTrNAF93NCPDVdLWXWrkU9tPzAc4edxB3m88JR187O23RhajXNiup7HHSu1hyn/tXjN7n+Wxxw1wUlaoSm0sZBE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372400; c=relaxed/simple; bh=70bnHkJFpUCCXu+j9B1n+5atmRiolOLq4l7B4iX6KPo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=rlCzMfYRwt03QNFQe2mFpALcnuj1DCEekBx84tZhWd4AJjuicP4ZpTu3l9aZcFrHvcggsNLJqHfSat2v/I+0KBUcvB1VonrNo6aF+z9orfdt+5WFkm8lHlBHwSJePQ8U5xYBOOVj4LX0lCiG2E4FkjTzaz1ryxCVwcFquSQVCyY= 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=iNBs+N5Z; arc=fail smtp.client-ip=52.101.85.23 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=nvidia.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=nvidia.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=Nvidia.com header.i=@Nvidia.com header.b="iNBs+N5Z" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=XBjlNhcH/RQLE0yAUP5QD7sbFLVb1VKrzQBSH+IYOlx1TJEo1yNfiuSR2arZLTYN193jrxiV2m9Pb3vBUm0uxz58KWD5CP0I2ibVNM7M/oxM6xz/Q8bJmjazlsTBPsPNmLZMaJx4OPEW3i89X98XK4U5n2gatuLLIYRu9OsT3yVN6kqOsdpdNz6ewDUVRfnPZ1cysqpGqFsb4rSWZSUCrEhJyFc6sugiounDoxdVmhRFvO1jcmnR+97zN7Ifsnkv+QjzUuRT+nnfexGBsUIlIMA0g9S1QxXCm94hoesJ92mDCjKM9Q82Ppe4ZZFIZnOjQ/wL1PKggtJJUVPaeAzWfA== 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=5AkKcKzPp75EWIb+lktDkDn8tHIBhE0/qiGIeR3H0Ps=; b=cUu9qLW/Fzh1bRLPHlkUB++u38x/aP/aFRbvC4KsIYQo3qP7jXHLIhvmDAskcLCneFFiXpBcLQ+RiUaAS+HCct/CoxhxzvWwe818vc9prtqlRToOGrP30RTah86S0TBcqHvORG9Zn5ApNdaGAY9pJ9D+sSULjBQEC9Nob+GEHrq8EkBJ+7nZCaEii2JrKkyHWUT/fWrElZ8JyGstgqA1YAy2IA9UT1XNniGXiczsaYCinXuIe+98WaOmDPtsSW+P5ASv5FV8f8At5vrKJQYroL74EHUHoaPkrjGcHcBt/YxYiK37mXU7sZnA0g0XyOvFmgc0SFIGR42BCvwF+2LgCQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=5AkKcKzPp75EWIb+lktDkDn8tHIBhE0/qiGIeR3H0Ps=; b=iNBs+N5ZrL1vAxJ0HNS9Y7q8RAJ+Gm39no7swHJDqsi1SAY6XUwLkKI8Tw/Sh6mCZvYx0OEI9TglWCNP1/8ys9HvpMz96dTZ/Ds/7HjHEshDgikg9TnZhOnZpDnUX4Nyu2bKOIjizxqDsm+HRUw1nW2jBPOOl+0wwnw7cTWPVr/6ERHQPPdEnEJ+Zvw1NlZZyxYIQEQ31rPli4da2eVyzVTuLCe9ET9b+h6PM3zDfcRj9Fub2AM7VRYzhXZOBjky23OMynZ6DHYbiRHZQwmdh7R5MEJI5eeKKereZZYEWcBbenir13Ug2k+TcI+xR/lCRYUlbLKxMWXKSgg6rbZhQQ== Received: from BN1PR12CA0001.namprd12.prod.outlook.com (2603:10b6:408:e1::6) by CY8PR12MB7316.namprd12.prod.outlook.com (2603:10b6:930:50::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.10; Mon, 14 Sep 2026 07:53:09 +0000 Received: from BN2PEPF0000A894.namprd04.prod.outlook.com (2603:10b6:408:e1:cafe::8a) by BN1PR12CA0001.outlook.office365.com (2603:10b6:408:e1::6) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:53:08 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by BN2PEPF0000A894.mail.protection.outlook.com (10.167.248.186) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:53:08 +0000 Received: from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:52:48 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail201.nvidia.com (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:47 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:52:39 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 25/32] gpu: nova-core: vgpu: initialize GSP plugin RPC buffers Date: Mon, 14 Sep 2026 10:49:00 +0300 Message-ID: <20260914074907.1399629-26-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN2PEPF0000A894:EE_|CY8PR12MB7316:EE_ X-MS-Office365-Filtering-Correlation-Id: 2497d26c-0812-4fc8-0bd6-08df123537ca X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700016|376014|7416014|1800799024|23010399003|56012099006|6133799003|11063799006|3023799007|22082099003|10067099003|18002099003; X-Microsoft-Antispam-Message-Info: rYzsd8eYXaEpD1F30/Q8f+prx8BNNO5l7l9Jc42jrqEeRqjWXlmEAeSmjYQiQDr0veEAVMV8oRgX3RW+2qP8+fyM4mCtF8wJl58nODNnpWFZaBS5MSkU3obLaCapegdjHkBhr2TSGfjfGJ3RbBOLLJQgAID1/EXbOAFxJqFe8t2RCj5PieAKl98YNe5p9ppiItFo4HKHYqCjQCYUIMBt1jn5KKXeneBg2HIHQzJcDC3bQScHHuGaVkSFmyHg81FD+2A9B+kdcKFk+VFLBMGxqbPYnYPY+ZcUgx+ktgfxryKrDcNhWhJrpuu5xYkkFSJ4pVDL54RXyGQ2t+p9HGqTlsvXHvWRPRSN2V/AiT9fC1rbiodKgoMXwMi0qgEQ4EzLuuSyF/QXcACh5LSm2EwS9xQBvgLY+jCHk5CIX2T8kaJJuOBmUGxLAbm7FBbF51bT9GKs2GhJTtort6LKjYOmGN3cuQrcvCeoaOBxMrjPq0ZNLTfeIlN5xBze38qkdw6l+BXh6zz7sd5YTqO5redeo/3g4uDR3WXrrzTqeHOKLKbIFTdMcltYgqUFXgb9+tkgWCrsQAgp8PZgIo0ip85nTPmexj75+cbFNfE3qShiqgg+bd6ZPgQgpY7CFaPNabbPJKl9nDtj4adcqzrGcuGo35GJB8iwLHIqkXk5aV4v+ViRKOsJnDY6zds9J5S58rrbvbgu4xwNV0SCWj0xhcgXLQ== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(36860700016)(376014)(7416014)(1800799024)(23010399003)(56012099006)(6133799003)(11063799006)(3023799007)(22082099003)(10067099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: HQc7AV1PS/M8fuhtuk1EtgZKpH52EXvkYTA4IfD5uHGpmlosja55OMUrZ5NiJAXI/fq5b5bBf22BFyuAQ0NJldwHbBFZta8HJgnVxqu5x1h5UG7JkTJPWE6GSbUUvbTNYTsaeIR2DtREWEUwbZiomCb4FvIyhUnbw9mDoyY3tBZDrBAXwPf7xyaNAV6+U4Ex8zm72wxY3B65auTnWQ8k+YWXyd6/qj5cMulFwY7RiL6VOeMkmyaYMRhr96KNDArh1hJPoQ9VGkZ2bExpEToPjQprgvylBvWF/vekWtdhMOULJkm3I8Y8lFk5FMU3bAWng963Yl52Eiw42NQRCeWTro8V5EpljpLicds+CJRZTOqWNS9aPVWcqcFdwQbdCvajYnSC2SqOIT7qYRaAKO3RCmlO7Nzut7KZ2hkkHPrLhV+a4sTpTj8u8ThYx7UVUgeq X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:53:08.6673 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2497d26c-0812-4fc8-0bd6-08df123537ca X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN2PEPF0000A894.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY8PR12MB7316 Content-Type: text/plain; charset="utf-8" After the GSP plugin has been successfully booted, the vGPU manager uses the GSP plugin RPC interface to communicate with it through a shared RPC buffer. The shared buffer needs region offsets, a protocol version and initial control and response state before the first request. The control sequence field also carries the boot-ready marker, so initialization must follow the plugin's ready indication. Add BAR1 accessors to initialize the shared control and response buffers. Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/mm/bar_user.rs | 10 ++ drivers/gpu/nova-core/vgpu/fw.rs | 2 + drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs | 142 +++++++++++++++++- 3 files changed, 147 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/nova-core/mm/bar_user.rs b/drivers/gpu/nova-core/m= m/bar_user.rs index ef357fd516b7..b7b4bf14b56d 100644 --- a/drivers/gpu/nova-core/mm/bar_user.rs +++ b/drivers/gpu/nova-core/mm/bar_user.rs @@ -141,6 +141,11 @@ pub(crate) fn try_read32(&self, offset: usize) -> Resu= lt { self.bar_user.bar1.try_read32(off) } =20 + fn try_write8(&self, value: u8, offset: usize) -> Result { + let off =3D self.bar_offset(offset)?; + self.bar_user.bar1.try_write8(value, off) + } + /// Write a 32-bit value at the given offset. pub(crate) fn try_write32(&self, value: u32, offset: usize) -> Result { let off =3D self.bar_offset(offset)?; @@ -261,6 +266,11 @@ pub(crate) fn try_read32(&self, offset: usize) -> Resu= lt { .try_read32(self.access_offset(offset, size_of::())?) } =20 + pub(crate) fn try_write8(&self, value: u8, offset: usize) -> Result { + self.access + .try_write8(value, self.access_offset(offset, size_of::())= ?) + } + pub(crate) fn try_write32(&self, value: u32, offset: usize) -> Result { self.access .try_write32(value, self.access_offset(offset, size_of::(= ))?) diff --git a/drivers/gpu/nova-core/vgpu/fw.rs b/drivers/gpu/nova-core/vgpu/= fw.rs index 1528cc56ce74..03225b9833c3 100644 --- a/drivers/gpu/nova-core/vgpu/fw.rs +++ b/drivers/gpu/nova-core/vgpu/fw.rs @@ -15,12 +15,14 @@ VGPU_CPU_GSP_COMMUNICATION_BUFF_TOTAL_SIZE, VGPU_CPU_GSP_CTRL_BUFF_REGION as RawControlRegion, VGPU_CPU_GSP_CTRL_BUFF_REGION_SIZE, + VGPU_CPU_GSP_CTRL_BUFF_VERSION, VGPU_CPU_GSP_ERROR_BUFF_REGION_SIZE, VGPU_CPU_GSP_GUEST_RPC_TRACE_BUFF_REGION_SIZE, VGPU_CPU_GSP_INIT_TASK_LOG_BUFF_REGION_SIZE, VGPU_CPU_GSP_KERNEL_TASK_LOG_BUFF_REGION_SIZE, VGPU_CPU_GSP_MESSAGE_BUFF_REGION_SIZE, VGPU_CPU_GSP_MIGRATION_BUFF_REGION_SIZE, + VGPU_CPU_GSP_RESPONSE_BUFF_REGION as RawResponseRegion, VGPU_CPU_GSP_RESPONSE_BUFF_REGION_SIZE, VGPU_CPU_GSP_VGPU_TASK_LOG_BUFF_REGION_SIZE, // }; diff --git a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs b/drivers/gpu/no= va-core/vgpu/gsp_plugin_comm.rs index af7a396021bc..5d129a1b908f 100644 --- a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs +++ b/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs @@ -16,7 +16,8 @@ =20 use super::fw::{ self, - RawControlRegion, // + RawControlRegion, + RawResponseRegion, // }; =20 /// Physical VRAM regions containing the vGPU plugin logs. @@ -75,9 +76,14 @@ fn take_region(region: &VramRegion, cursor: &mut u64, si= ze: u32) -> Result { map: BarMapping<'map, 'gpu>, control: VramRegion, + response: VramRegion, + message: VramRegion, + migration: VramRegion, + error: VramRegion, init_log: VramRegion, vgpu_log: VramRegion, kernel_log: VramRegion, + guest_trace: VramRegion, } =20 impl<'map, 'gpu> CommBufferRegion<'map, 'gpu> { @@ -92,22 +98,22 @@ pub(super) fn new( let mut cursor =3D 0; =20 let control =3D take_region(®ion, &mut cursor, fw::VGPU_CPU_GSP= _CTRL_BUFF_REGION_SIZE)?; - take_region( + let response =3D take_region( ®ion, &mut cursor, fw::VGPU_CPU_GSP_RESPONSE_BUFF_REGION_SIZE, )?; - take_region( + let message =3D take_region( ®ion, &mut cursor, fw::VGPU_CPU_GSP_MESSAGE_BUFF_REGION_SIZE, )?; - take_region( + let migration =3D take_region( ®ion, &mut cursor, fw::VGPU_CPU_GSP_MIGRATION_BUFF_REGION_SIZE, )?; - take_region( + let error =3D take_region( ®ion, &mut cursor, fw::VGPU_CPU_GSP_ERROR_BUFF_REGION_SIZE, @@ -127,13 +133,16 @@ pub(super) fn new( &mut cursor, fw::VGPU_CPU_GSP_KERNEL_TASK_LOG_BUFF_REGION_SIZE, )?; - take_region( + let guest_trace =3D take_region( ®ion, &mut cursor, fw::VGPU_CPU_GSP_GUEST_RPC_TRACE_BUFF_REGION_SIZE, )?; =20 - if cursor !=3D total_size || control.size() !=3D u64::try_from(siz= e_of::())? { + if cursor !=3D total_size + || control.size() !=3D u64::try_from(size_of::())? + || response.size() !=3D u64::try_from(size_of::())? + { return Err(EINVAL); } =20 @@ -142,9 +151,14 @@ pub(super) fn new( Ok(Self { map, control, + response, + message, + migration, + error, init_log, vgpu_log, kernel_log, + guest_trace, }) } =20 @@ -176,6 +190,21 @@ fn read_u32(&self, region: &VramRegion, field: usize) = -> Result { .try_read32(self.io_offset(region, field, size_of::())?) } =20 + fn write_u8(&self, region: &VramRegion, field: usize, value: u8) -> Re= sult { + self.map + .try_write8(value, self.io_offset(region, field, size_of::= ())?) + } + + fn write_u32(&self, region: &VramRegion, field: usize, value: u32) -> = Result { + self.map + .try_write32(value, self.io_offset(region, field, size_of::())?) + } + + fn write_u64(&self, region: &VramRegion, field: usize, value: u64) -> = Result { + self.map + .try_write64(value, self.io_offset(region, field, size_of::())?) + } + /// Return the physical regions occupied by the three plugin logs. pub(super) fn plugin_logs(&self) -> PluginLogRegions { PluginLogRegions { @@ -208,6 +237,105 @@ pub(super) fn is_plugin_ready(&self) -> Result { Ok(value =3D=3D fw::GSP_PLUGIN_BOOTLOADED) } =20 + /// Initialize the shared control and response buffers for plugin RPC. + #[expect(dead_code)] + pub(super) fn initialize(&self) -> Result { + self.write_u64( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.respo= nse_buff_offset), + u64::try_from(self.region_offset(&self.response)?)?, + )?; + self.write_u64( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.messa= ge_buff_offset), + u64::try_from(self.region_offset(&self.message)?)?, + )?; + self.write_u64( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.migra= tion_buff_offset), + u64::try_from(self.region_offset(&self.migration)?)?, + )?; + self.write_u64( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.error= _buff_offset), + u64::try_from(self.region_offset(&self.error)?)?, + )?; + self.write_u64( + &self.control, + core::mem::offset_of!( + RawControlRegion, + __bindgen_anon_1.guest_rpc_trace_buff_offset + ), + u64::try_from(self.region_offset(&self.guest_trace)?)?, + )?; + self.write_u32( + &self.control, + core::mem::offset_of!( + RawControlRegion, + __bindgen_anon_1.migration_buf_cpu_access_offset + ), + 0, + )?; + self.write_u8( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.is_mi= gration_in_progress), + 0, + )?; + self.write_u32( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.error= _buff_cpu_get_idx), + 0, + )?; + self.write_u32( + &self.control, + core::mem::offset_of!( + RawControlRegion, + __bindgen_anon_1.guest_rpc_trace_buff_cpu_get_idx + ), + 0, + )?; + self.write_u32( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.attac= hed_vgpu_count), + 1, + )?; + self.write_u8( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.is_gr= _init_done), + 0, + )?; + + self.write_u32( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.messa= ge_type), + 0, + )?; + // Replace the boot-ready marker with the initial RPC sequence. + self.write_u32( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.messa= ge_seq_num), + 0, + )?; + self.write_u32( + &self.response, + core::mem::offset_of!( + RawResponseRegion, + __bindgen_anon_1.message_seq_num_processed + ), + 0, + )?; + self.write_u32( + &self.response, + core::mem::offset_of!(RawResponseRegion, __bindgen_anon_1.resu= lt_code), + 0, + )?; + self.write_u32( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.versi= on), + fw::VGPU_CPU_GSP_CTRL_BUFF_VERSION, + ) + } + /// Invalidate the PTEs and release the communication mapping. pub(super) fn destroy(self, mm: &mut GpuMm<'_>) -> Result { self.map.destroy(mm) From nobody Fri Sep 25 10:37:46 2026 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010032.outbound.protection.outlook.com [52.101.46.32]) (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 3A7AC40A936 for ; Mon, 14 Sep 2026 07:53:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.32 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372403; cv=fail; b=VzNwE54KZf9J5HptUeB0XaYQyhxK7+fFSBmfYG4fXRR+wAE2sn0DFDoJ//JKWA+5Z1+jeOy5qVCNrzOExMArPEDZND+iSjMD6v2VapS9xdh6QjTcOsSS05Om11GtyIxXPyqvpivYx3Vecp99mmCOdwf79y8Kr1CK8QqcIRNlStA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372403; c=relaxed/simple; bh=hk5KQa0u4cCBq3OzJsaZ1EYOsx+sv1WXDwQy2RHn1YM=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=CraAN6UXBecNQXZ52UNL1avr53JCVsLfWqO9IsgeVo0ludxNdL0NuHA9F6LkLGJvGz8Q17syCaEyQrscLgx1ES7h3jALSQ6haFXptXrvOtUadBDxzCtqFrzfuFZxcSJJCDtct/A4Q2McPgMU44BQsj6S0hWxVxS+SxXnX8K0obs= 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=QgxjpMHP; arc=fail smtp.client-ip=52.101.46.32 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="QgxjpMHP" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=dBIB5Awcgif407H9UfDDlblVkUySdTopgq3v4mK9l5kiR2rgMkn0OdhFjOhYeBlKMeJDsx3FlulT+nD3cVYtl5fdF3pgEsizHrgVU42kcTP2MJYi2bv+4ZRfTjrvvcU0Nu5smKdlw5WtQzmVLp9fmkUcfjrCsRk9FfNbBC2m/ZKqvCPKcR46QFx/CSo3B/rbBTIFQfl5riUhPnDSKUkemh+/J7bgk9Ckyh9n3EbTT2WmNe7yEgPdR70jLF7/FfqsGHolSfIAYOTpWTd6kW4+gUIpkG1jaq2N/ijEqXbg/dKJrc643SCCW67eDsHVl04IKSV5/U6C0ki0V0m7bMatTA== 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=YIUCCeECdpimSiEQRiY+oPrF8SDcaN3HRsna9DsFyHE=; b=VBOy+loaR1P372vSU5J43XP2Mmcy3lLFNlQYHMPNV2srhmI/IBGFg5xQYyta2I/7GMeOOZcuZVhUOPNPeDPfEMEArKr5xuKo8CL/r+r9TYdG5wfomxCvbNpwnqMU4/JS08L7d1BMzydGbDR+UkV9xlPetcrTcW9UoyXc+Qrv7gN79WqUk63xE6o6S/w/S0iaUwIgnNmWEelc9ZD01Rc2kvgpltXHoQFEvf8uXeALo+5q+SxPZQWcVKSIp1u/wci/YJOv26AYzowjPJnaT9KGbL4Ybk/9nRu9APM83SAKpK68YGqeBxDYeTsPgffbMGq4QtK5WAOpQhMFTt5VjnhPqA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=YIUCCeECdpimSiEQRiY+oPrF8SDcaN3HRsna9DsFyHE=; b=QgxjpMHPNlf2d50eIwFZ84IdUerhsXd/syFMcUvZrrfGoxUiZr/ArvM0/UNukSKfvs1OWptnR2DUxo80ODeCbu47YDW7nZiZLzQjMaDUHwB9RW+VZBl8o0EV4fQbsUcW8h80LtUA4CqsufQkuwg3HMQdfxH+3/qgTt4Vyw433gRKnz7LyLWMiwuQXGwneo7nUqO3brfm6yS0jzJwG4QQrm8rFG2nL17ciYNtJ1vro+VQwjhbhfk609AYeH4sLxT5NruT8ZKohiNA+MLp5SHz0qPWRFW2WPuvMToVlg5/zGZV+uD2Axw69ePOxXAO1U2KqgYOnXH2Hd7IuKRrFS2X9g== Received: from BN0PR02CA0028.namprd02.prod.outlook.com (2603:10b6:408:e4::33) by IA0PR12MB8303.namprd12.prod.outlook.com (2603:10b6:208:3de::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:53:16 +0000 Received: from BN1PEPF00018547.namprd05.prod.outlook.com (2603:10b6:408:e4:cafe::2a) by BN0PR02CA0028.outlook.office365.com (2603:10b6:408:e4::33) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:53:15 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018547.mail.protection.outlook.com (10.167.248.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:53:15 +0000 Received: from rnnvmail204.nvidia.com (10.129.68.6) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:57 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail204.nvidia.com (10.129.68.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:52:55 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:52:47 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 26/32] gpu: nova-core: vgpu: add GSP plugin RPC transactions Date: Mon, 14 Sep 2026 10:49:01 +0300 Message-ID: <20260914074907.1399629-27-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018547:EE_|IA0PR12MB8303:EE_ X-MS-Office365-Filtering-Correlation-Id: 6f04ffcb-de0e-46c2-635c-08df12353c04 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|23010399003|7416014|376014|1800799024|82310400026|36860700016|6133799003|22082099003|18002099003|3023799007|10067099003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: Wi+EZ6rFtNBAH5vuZMpZVdezi89e+FFzBKRFoq1sID6GyHfbGzS24VJBWkhHSm9MxdpAJpveujC2GRFQcmTZnw6vQiO1ExWYe5B1T3PdMJV0PuD3qzuPEAX3wahiOO/x1Rd/7CU1WO0kpCUbj9zDBJdD6ErDqborVfPpKpjZb5hhbUqngJqdC8BItbIMKf+DaTfEiAigzP2vRFuo0kAWkEfYhvl9yFUs2rAWjz1j10OUd46jEIPjZ8gibSeCLWM3C9VScuQcVxeKfkiQC5vgvYf6WO/hQ+dvobINCJOJc/Z6KEkJC8QAV2Lz+cWMf8HAhP+36TiUJW9u/TTml7rOEVVpW34OJchQliL6nw7XrCBgtwha8PqO6qzjEay2RWqXatGK7rCru3N6ldQCYzoyPSCLZJA9a0BGP+BXljLJztexCJ+n+1yiHyxTvrps7qDN0EfQ/MS+krVB66j7abCPYD88Mgru2X2Md4zi3pMNHyYv89Tas9Log0gWj1kEblL9CV/iCT9WLSsWx1VTQO6SrK5K4XsFejS0hwKQ4LA/ItilRlB37eW/XMd4kR7trcAwK+3kqVXSEJLMuixAUzN5DJ9lXd0vh0Agz4+6h1T6qByZr0mowZGSPuSN5+1dpFdtibE0MSdz3PVbZb59/1u0ltsAOnqUg1N50DfvKH0WF3XqMiLs4QFWVuMB43XDf9JaFsqsWrE764xmH0NDMHRcKw== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(23010399003)(7416014)(376014)(1800799024)(82310400026)(36860700016)(6133799003)(22082099003)(18002099003)(3023799007)(10067099003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: pUG9GQApjMnWgrVi1vbC6DdFXjpfrWbRKB3h9H9eX0KNZnGw1SsLe6T4ChU4p6NgzPHxsAqQESU5mZyRc51LyEhWdsEkoqJHOB6T8a3j79teh866M5UDmcSQ2f1czumdpfrsH5sjhNkaSIbKOZqhawnYeleCLycOX4eXtsnINr7TJyJi+MwfAWasW3sk7JrAPt98MgaWiZtYYhUjlgUw8r4EOr+v2Uwh8ZRpp2ncuwtaRTH2z7zKtVvr0Q9liUjkP/fDfv/G8krUiteGJek7hmk9eaT0Qq7JU7UfrBdxX2VbejKPrv/CEGMnkxUdrJWoOW3kErFo7w/7wakgNIwhQ12hEpL9KDc3u7N3T/q5HZ5IQhKPdub7vElp5VikSOu41jLiByFe2iIB/z/Cfjr+4Hu7rL6t1NVeso6kL2CWcxl1KImr2yxzie1edWuYLtjT X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:53:15.7616 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6f04ffcb-de0e-46c2-635c-08df12353c04 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018547.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA0PR12MB8303 Content-Type: text/plain; charset="utf-8" The GSP plugin processes requests after the vGPU manager rings its VF doorbell and publishes completion in the shared response buffer. Add PluginRpc to own the communication mapping and track request sequences. Copy each payload before publishing its sequence, ring the doorbell and wait for the matching completion, checking firmware status and enforcing a timeout. Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/regs.rs | 33 +++- drivers/gpu/nova-core/vgpu.rs | 1 + drivers/gpu/nova-core/vgpu/fw.rs | 11 ++ drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs | 49 +++++- drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs | 150 ++++++++++++++++++ drivers/gpu/nova-core/vgpu/instance.rs | 17 +- 6 files changed, 251 insertions(+), 10 deletions(-) create mode 100644 drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs diff --git a/drivers/gpu/nova-core/regs.rs b/drivers/gpu/nova-core/regs.rs index bf43c71a53ee..af953aedb87b 100644 --- a/drivers/gpu/nova-core/regs.rs +++ b/drivers/gpu/nova-core/regs.rs @@ -7,13 +7,17 @@ Io, Mmio, // }, + prelude::*, sizes::SizeConstants, time, // }; use pin_init::Zeroable; =20 use crate::{ - driver::NovaRegisters, + driver::{ + Bar0, + NovaRegisters, // + }, falcon::{ DmaTrfCmdSize, FalconCoreRev, @@ -39,6 +43,33 @@ pub(crate) NV_PBUS_SW_SCRATCH(u32)[64] @ 0x00001400 {} } =20 +// VIRTUAL_FUNCTION + +register! { + base: NovaRegisters; + + // PF BAR0 exposes the virtual-function register window at 0x00b8_0000. + pub(crate) NV_VIRTUAL_FUNCTION_PRIV_DOORBELL(u32) @ 0x00b8_2200 { + 31:0 handle; + } +} + +impl NV_VIRTUAL_FUNCTION_PRIV_DOORBELL { + const DOORBELL_STRIDE: u32 =3D 32; + const DOORBELL_VECTOR: u32 =3D 17; + + /// Notify the GSP plugin for the given guest function and read back t= he doorbell. + pub(crate) fn ring_gsp_plugin(bar0: Bar0<'_>, gfid: u32) -> Result { + let value =3D gfid + .checked_mul(Self::DOORBELL_STRIDE) + .and_then(|value| value.checked_add(Self::DOORBELL_VECTOR)) + .ok_or(EOVERFLOW)?; + bar0.try_write_reg(Self::zeroed().with_handle(value))?; + bar0.try_read(NV_VIRTUAL_FUNCTION_PRIV_DOORBELL)?; + Ok(()) + } +} + // PGC6 register space. // // `GC6` is a GPU low-power state where VRAM is in self-refresh and the GP= U is powered down (except diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs index 8919322dc057..221a2804f5da 100644 --- a/drivers/gpu/nova-core/vgpu.rs +++ b/drivers/gpu/nova-core/vgpu.rs @@ -25,6 +25,7 @@ mod commands; mod fw; mod gsp_plugin_comm; +mod gsp_plugin_rpc; mod hal; mod instance; mod vram; diff --git a/drivers/gpu/nova-core/vgpu/fw.rs b/drivers/gpu/nova-core/vgpu/= fw.rs index 03225b9833c3..9925d5ccf71f 100644 --- a/drivers/gpu/nova-core/vgpu/fw.rs +++ b/drivers/gpu/nova-core/vgpu/fw.rs @@ -44,3 +44,14 @@ =20 pub(super) const GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_RESOURCES: u32 =3D bindings::GMCAPI_COMMANDS_GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_RESOURCES; + +/// State observed in the response buffer for an expected RPC sequence. +pub(super) enum RpcResponse { + Pending { + /// Last sequence completed by firmware. + sequence: u32, + }, + Complete { + status: u32, + }, +} diff --git a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs b/drivers/gpu/no= va-core/vgpu/gsp_plugin_comm.rs index 5d129a1b908f..20695929a58c 100644 --- a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs +++ b/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs @@ -17,7 +17,8 @@ use super::fw::{ self, RawControlRegion, - RawResponseRegion, // + RawResponseRegion, + RpcResponse, // }; =20 /// Physical VRAM regions containing the vGPU plugin logs. @@ -238,7 +239,6 @@ pub(super) fn is_plugin_ready(&self) -> Result { } =20 /// Initialize the shared control and response buffers for plugin RPC. - #[expect(dead_code)] pub(super) fn initialize(&self) -> Result { self.write_u64( &self.control, @@ -336,6 +336,51 @@ pub(super) fn initialize(&self) -> Result { ) } =20 + /// Copy and publish one RPC request to firmware. + pub(super) fn submit(&self, message: u32, sequence: u32, data: &[u8]) = -> Result { + if u64::try_from(data.len()).map_err(|_| EOVERFLOW)? > self.messag= e.size() { + return Err(E2BIG); + } + + for (index, chunk) in data.chunks(size_of::()).enumerate() { + let mut bytes =3D [0u8; size_of::()]; + bytes[..chunk.len()].copy_from_slice(chunk); + let field =3D index.checked_mul(size_of::()).ok_or(EOVERF= LOW)?; + self.write_u32(&self.message, field, u32::from_le_bytes(bytes)= )?; + } + + self.write_u32( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.messa= ge_type), + message, + )?; + self.write_u32( + &self.control, + core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.messa= ge_seq_num), + sequence, + ) + } + + /// Read firmware's response for an expected RPC sequence. + pub(super) fn response(&self, expected_sequence: u32) -> Result { + let sequence =3D self.read_u32( + &self.response, + core::mem::offset_of!( + RawResponseRegion, + __bindgen_anon_1.message_seq_num_processed + ), + )?; + if sequence !=3D expected_sequence { + return Ok(RpcResponse::Pending { sequence }); + } + + let status =3D self.read_u32( + &self.response, + core::mem::offset_of!(RawResponseRegion, __bindgen_anon_1.resu= lt_code), + )?; + Ok(RpcResponse::Complete { status }) + } + /// Invalidate the PTEs and release the communication mapping. pub(super) fn destroy(self, mm: &mut GpuMm<'_>) -> Result { self.map.destroy(mm) diff --git a/drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs b/drivers/gpu/nov= a-core/vgpu/gsp_plugin_rpc.rs new file mode 100644 index 000000000000..bc5d576d8601 --- /dev/null +++ b/drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs @@ -0,0 +1,150 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! GSP plugin RPC. +//! +//! ```text +//! Host (PluginRpc) Shared RPC buffer (VRAM) GSP plugin +//! | | | +//! |-- BAR1: payload --------->| Message | +//! |-- BAR1: type, sequence -->| Control | +//! | | | +//! |-- BAR0: VF doorbell ----------------------------->| +//! | |<-- read request ------| +//! | | | process RPC +//! | |<-- completion --------| +//! |-- poll processed seq ---->| Response | +//! |<-- matching seq, status --| | +//! ``` + +use kernel::{ + device, + prelude::*, + time::{ + delay::fsleep, + Delta, + Instant, + Monotonic, // + }, +}; + +use crate::{ + driver::Bar0, + mm::GpuMm, + regs::NV_VIRTUAL_FUNCTION_PRIV_DOORBELL, // +}; + +use super::{ + fw::RpcResponse, + gsp_plugin_comm::CommBufferRegion, + instance::Gfid, // +}; + +/// BAR1-backed channel used to communicate with one GSP plugin. +pub(super) struct PluginRpc<'map, 'gpu> { + comm: CommBufferRegion<'map, 'gpu>, + message_sequence: u32, +} + +impl<'map, 'gpu> PluginRpc<'map, 'gpu> { + pub(super) fn new(comm: CommBufferRegion<'map, 'gpu>) -> Self { + Self { + comm, + message_sequence: 0, + } + } + + pub(super) fn comm(&self) -> &CommBufferRegion<'map, 'gpu> { + &self.comm + } + + /// Initialize the control and response buffers for the first RPC. + #[expect(dead_code)] + pub(super) fn init_rpc(&mut self) -> Result { + self.comm.initialize()?; + self.message_sequence =3D 0; + Ok(()) + } + + fn next_sequence(&self) -> u32 { + let sequence =3D self.message_sequence.wrapping_add(1); + if sequence =3D=3D 0 { + 1 + } else { + sequence + } + } + + /// Write one RPC message, ring the VF doorbell, and wait for its resp= onse. + #[expect(dead_code)] + pub(super) fn rpc_call( + &mut self, + dev: &device::Device, + bar0: Bar0<'_>, + gfid: Gfid, + message_type: u32, + data: &[u8], + ) -> Result { + let sequence =3D self.next_sequence(); + self.comm.submit(message_type, sequence, data)?; + self.message_sequence =3D sequence; + + dev_dbg!( + dev, + "vGPU RPC: gfid=3D{} type=3D{} bytes=3D{} sequence=3D{}\n", + gfid.0, + message_type, + data.len(), + sequence, + ); + + NV_VIRTUAL_FUNCTION_PRIV_DOORBELL::ring_gsp_plugin(bar0, gfid.0)?; + self.wait_response(dev, sequence) + } + + fn wait_response(&self, dev: &device::Device, expected_= sequence: u32) -> Result { + let start =3D Instant::::now(); + let timeout =3D Delta::from_secs(120); + + loop { + match self.comm.response(expected_sequence)? { + RpcResponse::Complete { status } =3D> { + if status !=3D 0 { + dev_dbg!( + dev, + "vGPU RPC: sequence {} failed with status {}\n= ", + expected_sequence, + status, + ); + return Err(EIO); + } + + dev_dbg!( + dev, + "vGPU RPC: sequence {} completed after {:?}\n", + expected_sequence, + start.elapsed(), + ); + return Ok(()); + } + RpcResponse::Pending { sequence } =3D> { + if start.elapsed() >=3D timeout { + dev_dbg!( + dev, + "vGPU RPC: sequence {} timed out; last respons= e was {}\n", + expected_sequence, + sequence, + ); + return Err(ETIMEDOUT); + } + } + } + fsleep(Delta::from_millis(1)); + } + } + + /// Release the BAR1 mapping. + pub(super) fn destroy(self, mm: &mut GpuMm<'_>) -> Result { + self.comm.destroy(mm) + } +} diff --git a/drivers/gpu/nova-core/vgpu/instance.rs b/drivers/gpu/nova-core= /vgpu/instance.rs index 535e5ab7c2ad..994b046802c1 100644 --- a/drivers/gpu/nova-core/vgpu/instance.rs +++ b/drivers/gpu/nova-core/vgpu/instance.rs @@ -31,6 +31,7 @@ =20 use super::{ gsp_plugin_comm::CommBufferRegion, + gsp_plugin_rpc::PluginRpc, vram::{ VgpuVramLayout, VgpuVramSlot, @@ -135,7 +136,7 @@ pub(super) struct VgpuInstance<'gpu> { chids: ChannelIdReservation<'gpu>, num_plugin_channels: u32, vram_slot: VgpuVramSlot, - comm: CommBufferRegion<'gpu, 'gpu>, + pub(super) plugin_rpc: PluginRpc<'gpu, 'gpu>, needs_teardown: bool, } =20 @@ -149,7 +150,7 @@ fn bootload( ) -> Result { let fb =3D &self.vram_slot.fbmem; let mgmt =3D &self.vram_slot.mgmt_heap; - let logs =3D self.comm.plugin_logs(); + let logs =3D self.plugin_rpc.comm().plugin_logs(); =20 let payload =3D encode_vgpu_bootload( self.dbdf, @@ -182,11 +183,11 @@ fn bootload( payload.len() * size_of::(), ); =20 - self.comm.clear_plugin_ready()?; + self.plugin_rpc.comm().clear_plugin_ready()?; self.needs_teardown =3D true; send_bootload(cmdq, &payload)?; =20 - wait_plugin_ready(dev, &self.comm)?; + wait_plugin_ready(dev, self.plugin_rpc.comm())?; =20 dev_dbg!(dev, "bootload: gfid=3D{} plugin ready\n", self.gfid.0); Ok(()) @@ -263,9 +264,11 @@ fn release_vram_slot(&mut self, slot: VgpuVramSlot) ->= Result { =20 fn release_instance(&mut self, instance: VgpuInstance<'gpu>, mm: &mut = GpuMm<'_>) -> Result { let VgpuInstance { - comm, vram_slot, .. + plugin_rpc, + vram_slot, + .. } =3D instance; - let result =3D comm.destroy(mm); + let result =3D plugin_rpc.destroy(mm); self.release_vram_slot(vram_slot)?; result } @@ -340,7 +343,7 @@ pub(super) fn allocate_instance( chids, num_plugin_channels: 3, vram_slot, - comm, + plugin_rpc: PluginRpc::new(comm), needs_teardown: false, }; match self.instances.push_within_capacity(instance) { From nobody Fri Sep 25 10:37:46 2026 Received: from BN8PR05CU002.outbound.protection.outlook.com (mail-eastus2azon11011044.outbound.protection.outlook.com [52.101.57.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 304A33F4DDB for ; Mon, 14 Sep 2026 07:53:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.57.44 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372416; cv=fail; b=J0IUReRttzAsnMX5yb718JOtxAWr3pKRm/p0GFeUaEgs77/TxkT6QPz4RzkLE6Z57aQjQcOmFyy5QoDwB3GZNS14H/b4dEQ/5RJWt7orgRn/3VbwLMhjfq37geFLtdkQQIYJuKZsVpCX2LWJgZ4i3qyy5AGS0J31FI8IQyMfR7Y= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372416; c=relaxed/simple; bh=GgZeBTnBmeYridzCo6T0UEX5+HFGSKLo11mkraIl+0w=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=p/JEAHGPOMFiINXzuU5/Lwk5W+QkMv2WrDp/9gquBY9IrkLDMogWR6VJI0wdrueYUZdUTN8Qdl4CY4/xaRhrljW0PBJmqPMdfq4pCV+WfHa0MiztShkQQewWvPW2ik8t4BPk1VWJP4vWUamZL0afQpxiJXvtsQH4PCSBFuW8pjc= 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=hAhvYsQz; arc=fail smtp.client-ip=52.101.57.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="hAhvYsQz" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=kaOZvCQqavV8D2+AC6fu5YFu0sEzG3AzYRE+y8jaab1gmn15qaEFqIjxaKfss0pjlySr4kuBxkEgYEc2e5DNtTVmQBonxYoEWKVpTdSPkaW7TZftL7FONL4CgLbEOlwgZIBXampPvN3Tu7zCMzxUXW8V0LJkIxBwrTH/vi/SDcg7jwcXVCSm7CqdTslIrO5XhA3yP8MvFQLCe+t/AyMutIYP0iY1iQqjSeY7EVjfMDl1tbnW4rFtUCX4ZXPNyETv2XIJ12TueIl2fhPryNML8PCiaiYEUlWUDfGsppPw9g83An/yUcDO4Lowm0o7WtNoTpFsbJvDscST8/TtgE9hoQ== 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=qgSphZpe0LvR6POEtpGPsU73y2yJsswNY3X+27/2His=; b=yqsHcFS80Eupvz8Au9WSKJCnekWLvBDtQ0Rp2tp0rajTW09tR0DHc7qfgfe2DR7vergq9y6KB+RwKol4Zz+rVWiWOmS2SibKDoMJMgn7kHYJZ9IABPRSwT7NcC7Ci/4dgrw3qZU3q7qxndZjepQeFwaJkOkTsyj4igSzW+IDKNHuxvgKIPTTSuuN/1elUf8f/RX5ajqfGM7VC79qFNXRG6acqAnJLYDH5kEm2//oBiYm8RkiNA96V77/W14zn0Vj1Dg9RznCm5BFsdGoxp9X77rFVUiTjLntj1WC4d/A2WqodRf+NAXmsCk8RpBGnin8FsuQs3lZXuTZIXbsRRX7YQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=qgSphZpe0LvR6POEtpGPsU73y2yJsswNY3X+27/2His=; b=hAhvYsQzeBdi3sen6Ra6BLF+537Q+jKyBndugdjlpzNo5uSWAThk0IGulbhK/myM78Vr52Qw6CTDHnftBExUuyXezWCxwsj0jRBolxqXSF8BbTVYWdvETy+SPLKloFBnxxmqpzf3iXRJZJWvjngDUM+TGNDXmRmFKz0DMEecft1UJHCE+9odkuLKxtl/AAL+noyCgqMwzVF+Vz4AxILr1A0EVYO7DmHM0+t3qv1bLJO+/IpWlxCEgnD6TXH82v5L3cZuJ9uRnb4ChGkgbYKCyppRNdIs/w+HbcPZaRO4ygNEpF5Et3SPHruoNdSrKzS/H16t6J5srNXZ21TPMITrug== Received: from DS1P220CA0014.NAMP220.PROD.OUTLOOK.COM (2603:10b6:8:455::18) by PH7PR12MB7818.namprd12.prod.outlook.com (2603:10b6:510:269::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:53:27 +0000 Received: from DS2PEPF000061C1.namprd02.prod.outlook.com (2603:10b6:8:455:cafe::5e) by DS1P220CA0014.outlook.office365.com (2603:10b6:8:455::18) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:53:26 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by DS2PEPF000061C1.mail.protection.outlook.com (10.167.23.68) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:53:26 +0000 Received: from rnnvmail203.nvidia.com (10.129.68.9) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:53:04 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail203.nvidia.com (10.129.68.9) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:53:04 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:52:56 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 27/32] gpu: nova-core: vgpu: negotiate the GSP plugin RPC version Date: Mon, 14 Sep 2026 10:49:02 +0300 Message-ID: <20260914074907.1399629-28-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PEPF000061C1:EE_|PH7PR12MB7818:EE_ X-MS-Office365-Filtering-Correlation-Id: 2c8d1596-5e56-4817-e36f-08df1235427b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|7416014|376014|23010399003|1800799024|82310400026|11063799006|56012099006|10067099003|22082099003|18002099003|6133799003|3023799007; X-Microsoft-Antispam-Message-Info: 3sxYv81wEE2fH4+P2viB8ILWg1qYTpZBoBXtT7ZqkqBkFg9Y4c+GBsb/TL83asXYmbNDhWYViIORqkCfE12IG7UNuVxjg78bWxgV1zW1w1elxYjyQk1saqVVqaqYH14DIg70+Iwkt6EvG9rZBnuML3qe/774tWXDosSvtSpiofC5fV24CBLu+nx59Mlwozb53ekqOdlBg+qdzPmlSkYACXeJqnRpJXJv6Z00SGymBuXnM4y4z8Fn2RAmzVEwbNq4+KWlXSCmuqWXobGVKbXqDaWQYc5JPRkHBJxarw7IFW4JF2JcS7XWY204YljW/xs5/Kt86e+qr+8jGJBEVhowuxesrx7nyELgcJWc5qHZtEJuQ1EuD99i01lx07UZCgjN+A13s0GzbnX6xZpEe26dHj0IfLuYDd8hWt+jHZlC3k7GqqSfaYs/IjX1WfOamKM8Nmc2PIA170gEYaMGoe1SyzgNp7aFDLY//kw2oGTuZVIOvU9w0C2crnWOkonoo5Yl0dfZk6bJt4VDQP/tSckPEwwOoyEOkceSy+p5V6mf2bLCKPRiY+rW2QBmV1DtfsLjUURrj37vQM9xSquC+rdfRpmkIdcPOPMTiCPKI0aOG71wWmGFVRNdyXnrmqhL73rb7kIVvdy2Yh65H6niU/p0usWl6m4siY/johzK+cZCv5nyLAzkDgUTvj6vtSdWtK1GGUgvlHfgyd31I1LJiUtjrw== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(36860700016)(7416014)(376014)(23010399003)(1800799024)(82310400026)(11063799006)(56012099006)(10067099003)(22082099003)(18002099003)(6133799003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: yftMzyEWUy8WRr4NOhGz7bie24ZUd29X3Eul2lAVtvwr+QeTih5CIgXKJh+JGtBGo72er7KJjr7PODhTY4XAgh8+YToWLSLdcSwB6tX2OawPffigpijRugg/Is5A7nrGN3+obR0TZY1qefPmOCk6ghSJnZVsfgIiX01pSe2dbLo1ueZEW8bPR3DYNr3UaDSGHCiiDqS6geleeFLt3Tx1Q73UXB2mwy6J9FrQqpGlmrCVusYYoTOW2F0IxQAqs8vb03zsieYyDg4MredzCUPkqKxiO4OZr4qZkjx6QGsKTLdLWSitp+WDHJSY1CDdCibeE9JFqeWNHjBPTGlx7cLgOmCEUu9Qt5MhxVfsARv4b8GLqgAwrUBvy3yTROvc6yUbYgMbeIIH1OwdcQYSzrXWLd8y/usOKz4/hyG/n/Wi4uXvr1V3EcjPTV5MVfaXcMk+ X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:53:26.6459 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2c8d1596-5e56-4817-e36f-08df1235427b X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DS2PEPF000061C1.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR12MB7818 Content-Type: text/plain; charset="utf-8" The vGPU manager negotiates the RPC protocol with the booted GSP plugin before sending configuration parameters. Add the version-negotiation message ID and typed RPC submission. Initialize the shared RPC buffers after the plugin reports ready, then send the negotiation request. Co-developed-by: Eliot Courtney Signed-off-by: Eliot Courtney Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/vgpu/commands.rs | 18 +++++++++++++++++- drivers/gpu/nova-core/vgpu/fw.rs | 2 ++ drivers/gpu/nova-core/vgpu/fw/commands.rs | 9 +++++++++ drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs | 5 +++-- drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs | 11 ++++++----- drivers/gpu/nova-core/vgpu/instance.rs | 10 ++++++++-- 6 files changed, 45 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/nova-core/vgpu/commands.rs b/drivers/gpu/nova-core= /vgpu/commands.rs index a2df36b901a8..abc85b0365f2 100644 --- a/drivers/gpu/nova-core/vgpu/commands.rs +++ b/drivers/gpu/nova-core/vgpu/commands.rs @@ -22,7 +22,13 @@ }, }; =20 -use super::instance::Gfid; +use crate::driver::Bar0; + +use super::{ + fw::RpcMessage, + gsp_plugin_rpc::PluginRpc, + instance::Gfid, // +}; =20 use super::fw::commands::VgpuPropertiesSchema; =20 @@ -144,3 +150,13 @@ pub(super) fn send_cleanup( dev_dbg!(dev, "cleanup: gfid=3D{} done\n", gfid.0); Ok(()) } + +/// Negotiate the host protocol with a bootloaded GSP plugin. +pub(super) fn negotiate_plugin_version( + dev: &device::Device, + bar0: Bar0<'_>, + gfid: Gfid, + rpc: &mut PluginRpc<'_, '_>, +) -> Result { + rpc.rpc_call(dev, bar0, gfid, RpcMessage::VersionNegotiation, &[]) +} diff --git a/drivers/gpu/nova-core/vgpu/fw.rs b/drivers/gpu/nova-core/vgpu/= fw.rs index 9925d5ccf71f..6cec92c9b505 100644 --- a/drivers/gpu/nova-core/vgpu/fw.rs +++ b/drivers/gpu/nova-core/vgpu/fw.rs @@ -27,6 +27,8 @@ VGPU_CPU_GSP_VGPU_TASK_LOG_BUFF_REGION_SIZE, // }; =20 +pub(super) use commands::RpcMessage; + pub(super) const GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE: u32 =3D bindings::GMCAPI_COMMANDS_GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE; =20 diff --git a/drivers/gpu/nova-core/vgpu/fw/commands.rs b/drivers/gpu/nova-c= ore/vgpu/fw/commands.rs index 2e6518e2460b..b765d30a1d61 100644 --- a/drivers/gpu/nova-core/vgpu/fw/commands.rs +++ b/drivers/gpu/nova-core/vgpu/fw/commands.rs @@ -25,6 +25,15 @@ Required, // }; =20 +use super::bindings; + +/// Message types supported by the nova-core plugin RPC channel. +#[derive(Clone, Copy)] +#[repr(u32)] +pub(in crate::vgpu) enum RpcMessage { + VersionNegotiation =3D bindings::MESSAGE_NV_VGPU_CPU_RPC_MSG_VERSION_N= EGOTIATION, +} + bitfield! { pub(in crate::vgpu) struct Dbdf(u32) { 2:0 function; diff --git a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs b/drivers/gpu/no= va-core/vgpu/gsp_plugin_comm.rs index 20695929a58c..e385ecff43fa 100644 --- a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs +++ b/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs @@ -18,6 +18,7 @@ self, RawControlRegion, RawResponseRegion, + RpcMessage, RpcResponse, // }; =20 @@ -337,7 +338,7 @@ pub(super) fn initialize(&self) -> Result { } =20 /// Copy and publish one RPC request to firmware. - pub(super) fn submit(&self, message: u32, sequence: u32, data: &[u8]) = -> Result { + pub(super) fn submit(&self, message: RpcMessage, sequence: u32, data: = &[u8]) -> Result { if u64::try_from(data.len()).map_err(|_| EOVERFLOW)? > self.messag= e.size() { return Err(E2BIG); } @@ -352,7 +353,7 @@ pub(super) fn submit(&self, message: u32, sequence: u32= , data: &[u8]) -> Result self.write_u32( &self.control, core::mem::offset_of!(RawControlRegion, __bindgen_anon_1.messa= ge_type), - message, + message as u32, )?; self.write_u32( &self.control, diff --git a/drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs b/drivers/gpu/nov= a-core/vgpu/gsp_plugin_rpc.rs index bc5d576d8601..ff009f241c32 100644 --- a/drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs +++ b/drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs @@ -35,7 +35,10 @@ }; =20 use super::{ - fw::RpcResponse, + fw::{ + RpcMessage, + RpcResponse, // + }, gsp_plugin_comm::CommBufferRegion, instance::Gfid, // }; @@ -59,7 +62,6 @@ pub(super) fn comm(&self) -> &CommBufferRegion<'map, 'gpu= > { } =20 /// Initialize the control and response buffers for the first RPC. - #[expect(dead_code)] pub(super) fn init_rpc(&mut self) -> Result { self.comm.initialize()?; self.message_sequence =3D 0; @@ -76,13 +78,12 @@ fn next_sequence(&self) -> u32 { } =20 /// Write one RPC message, ring the VF doorbell, and wait for its resp= onse. - #[expect(dead_code)] pub(super) fn rpc_call( &mut self, dev: &device::Device, bar0: Bar0<'_>, gfid: Gfid, - message_type: u32, + message_type: RpcMessage, data: &[u8], ) -> Result { let sequence =3D self.next_sequence(); @@ -93,7 +94,7 @@ pub(super) fn rpc_call( dev, "vGPU RPC: gfid=3D{} type=3D{} bytes=3D{} sequence=3D{}\n", gfid.0, - message_type, + message_type as u32, data.len(), sequence, ); diff --git a/drivers/gpu/nova-core/vgpu/instance.rs b/drivers/gpu/nova-core= /vgpu/instance.rs index 994b046802c1..a65b95d11f88 100644 --- a/drivers/gpu/nova-core/vgpu/instance.rs +++ b/drivers/gpu/nova-core/vgpu/instance.rs @@ -22,6 +22,7 @@ }; =20 use crate::{ + driver::Bar0, gpu::ChannelIdReservation, mm::{ bar_user::BarUser, @@ -41,6 +42,7 @@ }; =20 use super::commands::{ + negotiate_plugin_version, query_vgpu_properties, send_bootload, send_cleanup, @@ -355,11 +357,12 @@ pub(super) fn allocate_instance( } } =20 - /// Bootload the GSP plugin for a registered instance. + /// Boot the GSP plugin and negotiate its RPC version. pub(super) fn activate_instance( &mut self, dev: &device::Device, cmdq: &Cmdq<'_>, + bar0: Bar0<'_>, gfid: Gfid, fifo_engine_list: &FifoEngineList, ) -> Result { @@ -368,7 +371,10 @@ pub(super) fn activate_instance( .iter_mut() .find(|instance| instance.gfid =3D=3D gfid) .ok_or(ENOENT)?; - instance.bootload(dev, cmdq, fifo_engine_list) + instance.bootload(dev, cmdq, fifo_engine_list)?; + + instance.plugin_rpc.init_rpc()?; + negotiate_plugin_version(dev, bar0, gfid, &mut instance.plugin_rpc) } =20 /// Stop the plugin and release the instance's firmware and host resou= rces. From nobody Fri Sep 25 10:37:46 2026 Received: from PH0PR06CU001.outbound.protection.outlook.com (mail-westus3azon11011057.outbound.protection.outlook.com [40.107.208.57]) (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 1D9D43F482F for ; Mon, 14 Sep 2026 07:53:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.208.57 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372420; cv=fail; b=tf4b/aN06Jn+QB0aQgsO075+n/r/QHBmI1Xg4Yz1YpGAkq2PvAU3r/Aq2CMEQh8K+aeHjb9Lvuf/2aB7eYKJF5Y2Aa+0w5L5eKzUmxkm6dn2ccnfVP+SI9PMt0v2NWZ7acxCllSoj9kpxLABVQtoU6kwVkSGJqcuuqqosoDWFTA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372420; c=relaxed/simple; bh=o+4RUkIuY6+QNQF3WuvVwcYaTgI7d8vyubIjehA/Ico=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=e7umCKlU0owHk9MjeygBFOpgchUNzAjOyO5F0GaEkWxXvwYUe6b74/CsFinJsigqW00DjtV3rT6do87gJo0edk0H6YKucJvqL59gTuAlLbPIe+LVKqh0mda+kdqhMmmD/2D4aVMpnLCyHypEcg56s8sh9Dwog37O48w9JJ7wBbM= 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=BJU5AB+t; arc=fail smtp.client-ip=40.107.208.57 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="BJU5AB+t" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rMK0M6hAD6ebLSzcCIWLeXj4Hwad3wfKMh/vrJw+HOAYEMaDJcQZvw44vEIYGIrAfx7Rfd+Bxkjq5iXTdAbTKwno6WvBxrAbB2LWNoP8s27v6nRAd/jkPVUU06zZhFysQdW5qO9L1X+A4aCnflI6mzW6OsE6UEPL98UXFEmxQtSwnUvd2c55ggb4Six9nb95b4MUz//bGQ4uw2hwafmAptXgxnQwIq7RlOETQQt9pPxAN7guaGtmYXGmqT4N/y24o47nCGxhsNMvnCcHRe93RU0lCe3HrykGa2PGL9wDBFTcYNol+8oWfkXtz9f7FC33K6ly3yKjHcCKULEqzMrAxg== 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=/A9500rDLY/97PT1YiZWJcyf/7CwwWikj5H8N0i/LY8=; b=f6eAToljmYSqVWv1F7ihVAC6PsgwKuecvcUtfe14tPrcXovEU4DRtBk91Ag5rtSAgfve5OyW2Vknk6suAdlfh2SSY3jicVaqZbUPFf+14dFMeG1MHWmQGsiOtKFzFYq8xQr1KskKeZdb1Vnpd6iekAW/+dKQUvNk+Ib5oQSWpmahGgJeLsiY1kYTcx/PpCGz2//oaxPsE0CMFj/lydLbTKHg/0A8yTYeq16Jh0TxtsOeGLa+U6hSuqy21+HYin8wj6AeDIaKPVAWuMcMMYZXt9R2x3oxTH4/lXnzw5EM7M9ZBwv5aSAAE6w+7fgU/0CmXeDiufndFZ6iG9X1XIjm/Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=/A9500rDLY/97PT1YiZWJcyf/7CwwWikj5H8N0i/LY8=; b=BJU5AB+tknFmQ7TNG9UoL6bSbBJmqKoxVckQxMiNOGNokrJLKjiadEZz5ixRYFPsLsJMBwLtqOabRXqqCvIdmgPHxWQP/tPa9rh76ZVIZGvrgAIggOQ09ETWzh9RfzmN3OJhYYFBL4xf/OvYVBJYpq5CC+zKsG2eHeO1vz1Oml9R6X3OTCi5XXTyr4npHh4E9FsWgwl6mp+1PErsb3rwtM4FZDfB/OQnlrgg01g7HYqjK4SI5Pa56ViKGY5RFqFJaysegzSROIVCnPxNyJF4y0rcW54K0p3BT9Gv8AGt8YIJ9lUWPclIg509BkJoOlW87iUj+2XU5ZGpMVVI0hbVIw== Received: from CH0P223CA0005.NAMP223.PROD.OUTLOOK.COM (2603:10b6:610:116::16) by SJ0PR12MB6687.namprd12.prod.outlook.com (2603:10b6:a03:47a::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:53:31 +0000 Received: from DS2PEPF000061C2.namprd02.prod.outlook.com (2603:10b6:610:116:cafe::1) by CH0P223CA0005.outlook.office365.com (2603:10b6:610:116::16) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:53:31 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by DS2PEPF000061C2.mail.protection.outlook.com (10.167.23.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:53:31 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:53:13 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:53:12 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:53:04 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 28/32] gpu: nova-core: vgpu: send GSP plugin configuration parameters Date: Mon, 14 Sep 2026 10:49:03 +0300 Message-ID: <20260914074907.1399629-29-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PEPF000061C2:EE_|SJ0PR12MB6687:EE_ X-MS-Office365-Filtering-Correlation-Id: 1c1a427d-05b0-4aaa-2a79-08df1235453d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|36860700016|7416014|376014|23010399003|1800799024|10067099003|3023799007|6133799003|22082099003|18002099003|56012099006|11063799006; X-Microsoft-Antispam-Message-Info: K5G5OFsgGsM5szRoBYqWEPLZl+s1LRFOLEHDcjgI/AkeLyZIg4xxHydvykBtA9okDKQxVP7ShkzRFQpXQ91oDfTlEfIlr8YcITf+gqoqxUneKpuvNKwYBv5wBLculBnXwMt9Sec3qXIvn9nbejHtKUYeWJ+3BV8tuVB63ni6BVxtb4OxTCjhzD6enqeZSo7u/SRgyNPM5UwKGXOrkuag8b8WUR+m+wxJLNpeNUGtQUdZV9rQzeELIShY6jukGfqVxkYz9teRjcg//OAGOu5T7XzEVWR9WGqbEoiwGqYlClzic0xcXx9X5QYsF4buxTb5BCmyoiNiiEatbECWJU6gkzgVjVbkF+D30QNiwic3PiConkfcGt1yPGCPGlcirXa7ZVKDGlv1U0HmkPVhfuiVeFLXnoH6z9C/bnL8rypdNjBN7/nS0z1ymgxZyX5X1BFP2+DFgbUR/0HgehACBp8+FYfb9sVp0q+hbUG3uRtR8OC4iMsiq45CdOa/qfvqbXSSu+GkBXxlqTakAZgLeqJXuDy8mkObUurUUoNocXHUOb3bJli+hsTUkWMlB567jthgt83iX9JC91W2iReRCilS7KiK7+Itt1CJYl+a5W+/S+ODpyfAV0J4iXb6DglQLO7iMk/gwxB6lGIBlM/XRE4KYLxlchuisX2aFi+FS5EhhZvAlY7/0d68ioMqTHXmKdpgULPjUVq7qW85u/eSMTU9sQ== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(36860700016)(7416014)(376014)(23010399003)(1800799024)(10067099003)(3023799007)(6133799003)(22082099003)(18002099003)(56012099006)(11063799006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: x5odYu5bgFE3X7Js3/jINp4zACBI1vGPEwDcJ0xBsCYirojDBDY+SmRMobzDXl0Irea56ky4mDVWIfmWCZIbWCKNRmq7ji4tjplwc20oGRpYwLKPn5689RNPhSpF/Soel0K86QQ+iG3jM29oZWVq5RlZ+udMEiZ5Swi9454p3wX1JBSZi/3vYZu/lKOdYmwosKnlv2kny1xhQOrot+CZA0a6tWqsdt+IOjEJzQv7IEoRGdRwlbdxZBULZn5mqtfOlX2JSJrGPZ547jXM2nX/oZHTG9DoHuZtPzGAf33/mbmShi44Sk5XKOkVP9HUHrAii02MSXSLwgadhTamZmPp5LPWaqVepkjQGMmoOv3eVOXbDvgJF2vM8eooVtV6SFt0w2RohO/VieiWaH0YefaLUfCB6aois5kz8iUKVpI6BMtDAIjuFsj5A5Aea9ffBQyI X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:53:31.2635 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 1c1a427d-05b0-4aaa-2a79-08df1235453d X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DS2PEPF000061C2.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB6687 Content-Type: text/plain; charset="utf-8" The GSP plugin needs the instance identity, channel allocation and host parameters before it can serve guest requests. Encode these parameters as an NVKV stream, prefix it with its word count and send SETUP_CONFIG_PARAMS_AND_INIT after protocol negotiation. Co-developed-by: Eliot Courtney Signed-off-by: Eliot Courtney Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/vgpu/commands.rs | 17 +++ drivers/gpu/nova-core/vgpu/fw/commands.rs | 126 +++++++++++++++++++ drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs | 18 +++ drivers/gpu/nova-core/vgpu/instance.rs | 20 ++- 4 files changed, 179 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/nova-core/vgpu/commands.rs b/drivers/gpu/nova-core= /vgpu/commands.rs index abc85b0365f2..2089c91b648e 100644 --- a/drivers/gpu/nova-core/vgpu/commands.rs +++ b/drivers/gpu/nova-core/vgpu/commands.rs @@ -160,3 +160,20 @@ pub(super) fn negotiate_plugin_version( ) -> Result { rpc.rpc_call(dev, bar0, gfid, RpcMessage::VersionNegotiation, &[]) } + +/// Send an instance's encoded configuration to the GSP plugin. +pub(super) fn send_plugin_config( + dev: &device::Device, + bar0: Bar0<'_>, + gfid: Gfid, + rpc: &mut PluginRpc<'_, '_>, + config: &[u64], +) -> Result { + rpc.rpc_call_nvkv( + dev, + bar0, + gfid, + RpcMessage::SetupConfigParamsAndInit, + config, + ) +} diff --git a/drivers/gpu/nova-core/vgpu/fw/commands.rs b/drivers/gpu/nova-c= ore/vgpu/fw/commands.rs index b765d30a1d61..0386c8178962 100644 --- a/drivers/gpu/nova-core/vgpu/fw/commands.rs +++ b/drivers/gpu/nova-core/vgpu/fw/commands.rs @@ -32,6 +32,7 @@ #[repr(u32)] pub(in crate::vgpu) enum RpcMessage { VersionNegotiation =3D bindings::MESSAGE_NV_VGPU_CPU_RPC_MSG_VERSION_N= EGOTIATION, + SetupConfigParamsAndInit =3D bindings::MESSAGE_NV_VGPU_CPU_RPC_MSG_SET= UP_CONFIG_PARAMS_AND_INIT, } =20 bitfield! { @@ -259,3 +260,128 @@ pub(in crate::vgpu) struct VgpuProperties { impl VgpuProperties { const STRING_LEN: usize =3D 64; } + +#[derive(Clone, Copy)] +enum HypervisorType { + Unknown =3D 4, +} + +impl From for u32 { + fn from(value: HypervisorType) -> Self { + value as u32 + } +} + +#[derive(Clone, Copy)] +enum CpuArch { + Aarch64 =3D 1, + X86_64 =3D 2, +} + +impl CpuArch { + fn host() -> Result { + if cfg!(target_arch =3D "x86_64") { + Ok(Self::X86_64) + } else if cfg!(target_arch =3D "aarch64") { + Ok(Self::Aarch64) + } else { + Err(EOPNOTSUPP) + } + } +} + +impl From for u32 { + fn from(value: CpuArch) -> Self { + value as u32 + } +} + +#[derive(Clone, Copy)] +struct MigrationFeature(u32); + +impl MigrationFeature { + const PRESERVE_CTX_BUF: Self =3D Self(0x4000); +} + +impl From for u32 { + fn from(value: MigrationFeature) -> Self { + value.0 + } +} + +bitfield! { + struct FeatureFlags(u64) { + 3:3 enable_uvm =3D> bool; + 5:5 vmm_migration =3D> bool; + } +} + +nvkv_encode! { + struct PluginConfigParamsRequest { + uuid: Key<[u8; 16], { Self::UUID_KEY }>, + dbdf: Key, + dev_inst: Key, + vgpu_type: Key, + vm_pid: Key, + swizz_id: Key, + num_channels: Key, + num_plugin_channels: Key, + vmm_cap: Key, + migration_feature: Key, + hypervisor_type: Key, + cpu_arch: Key, + page_size: Key, + feature_flags: Key, + } +} + +impl PluginConfigParamsRequest { + const UUID_KEY: KeyId =3D 0x0001; + const DBDF_KEY: KeyId =3D 0x0002; + const DEV_INST_KEY: KeyId =3D 0x0004; + const VGPU_TYPE_KEY: KeyId =3D 0x0005; + const VM_PID_KEY: KeyId =3D 0x0006; + const SWIZZ_ID_KEY: KeyId =3D 0x0010; + const NUM_CHANNELS_KEY: KeyId =3D 0x0011; + const NUM_PLUGIN_CHANNELS_KEY: KeyId =3D 0x0012; + const VMM_CAP_KEY: KeyId =3D 0x0020; + const MIGRATION_FEATURE_KEY: KeyId =3D 0x0021; + const HYPERVISOR_TYPE_KEY: KeyId =3D 0x0022; + const CPU_ARCH_KEY: KeyId =3D 0x0023; + const PAGE_SIZE_KEY: KeyId =3D 0x0024; + const FEATURE_FLAGS_KEY: KeyId =3D 0x0030; +} + +/// Encodes plugin configuration parameters using the typed NVKV schema. +pub(in crate::vgpu) fn encode_plugin_config_params( + uuid: [u8; 16], + dbdf: Dbdf, + vgpu_type: u32, + vm_pid: u32, + num_channels: u32, + num_plugin_channels: u32, +) -> Result { + let request =3D PluginConfigParamsRequest { + uuid: uuid.into(), + dbdf: dbdf.into(), + dev_inst: 0.into(), + vgpu_type: vgpu_type.into(), + vm_pid: vm_pid.into(), + swizz_id: SwizzId::WHOLE_GPU.into(), + num_channels: num_channels.into(), + num_plugin_channels: num_plugin_channels.into(), + vmm_cap: 0.into(), + migration_feature: MigrationFeature::PRESERVE_CTX_BUF.into(), + hypervisor_type: HypervisorType::Unknown.into(), + cpu_arch: CpuArch::host()?.into(), + page_size: u64::try_from(kernel::page::PAGE_SIZE)?.into(), + feature_flags: FeatureFlags::zeroed() + .with_enable_uvm(false) + .with_vmm_migration(true) + .into(), + }; + + let mut encoder =3D Encoder::new(); + request.encode(&mut encoder)?; + Ok(encoder.finish()) +} diff --git a/drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs b/drivers/gpu/nov= a-core/vgpu/gsp_plugin_rpc.rs index ff009f241c32..2b9bccd8acb5 100644 --- a/drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs +++ b/drivers/gpu/nova-core/vgpu/gsp_plugin_rpc.rs @@ -26,6 +26,7 @@ Instant, Monotonic, // }, + transmute::AsBytes, // }; =20 use crate::{ @@ -103,6 +104,23 @@ pub(super) fn rpc_call( self.wait_response(dev, sequence) } =20 + /// Send an NVKV stream prefixed by its word count. + pub(super) fn rpc_call_nvkv( + &mut self, + dev: &device::Device, + bar0: Bar0<'_>, + gfid: Gfid, + message_type: RpcMessage, + encoded: &[u64], + ) -> Result { + let word_count =3D u64::try_from(encoded.len()).map_err(|_| EOVERF= LOW)?; + let mut payload =3D KVec::new(); + payload.extend_from_slice(&word_count.to_le_bytes(), GFP_KERNEL)?; + payload.extend_from_slice(AsBytes::as_bytes(encoded), GFP_KERNEL)?; + + self.rpc_call(dev, bar0, gfid, message_type, &payload) + } + fn wait_response(&self, dev: &device::Device, expected_= sequence: u32) -> Result { let start =3D Instant::::now(); let timeout =3D Delta::from_secs(120); diff --git a/drivers/gpu/nova-core/vgpu/instance.rs b/drivers/gpu/nova-core= /vgpu/instance.rs index a65b95d11f88..c3ec24f48682 100644 --- a/drivers/gpu/nova-core/vgpu/instance.rs +++ b/drivers/gpu/nova-core/vgpu/instance.rs @@ -46,12 +46,14 @@ query_vgpu_properties, send_bootload, send_cleanup, + send_plugin_config, send_shutdown, Dbdf, VgpuProperties, // }; =20 use super::fw::commands::{ + encode_plugin_config_params, encode_vgpu_bootload, ChannelMapEntry, // }; @@ -195,6 +197,19 @@ fn bootload( Ok(()) } =20 + fn configure_plugin(&mut self, dev: &device::Device, ba= r0: Bar0<'_>) -> Result { + let config =3D encode_plugin_config_params( + [0; 16], + self.dbdf, + self.vgpu_type.vgpu_type_id(), + self.vm_pid, + u32::try_from(self.chids.len()).map_err(|_| EOVERFLOW)?, + self.num_plugin_channels, + )?; + + send_plugin_config(dev, bar0, self.gfid, &mut self.plugin_rpc, &co= nfig) + } + /// Stop the plugin when firmware may own instance resources. fn shutdown(&mut self, dev: &device::Device, cmdq: &Cmd= q<'_>) -> Result { if self.needs_teardown { @@ -357,7 +372,7 @@ pub(super) fn allocate_instance( } } =20 - /// Boot the GSP plugin and negotiate its RPC version. + /// Boot and configure the GSP plugin for a registered instance. pub(super) fn activate_instance( &mut self, dev: &device::Device, @@ -374,7 +389,8 @@ pub(super) fn activate_instance( instance.bootload(dev, cmdq, fifo_engine_list)?; =20 instance.plugin_rpc.init_rpc()?; - negotiate_plugin_version(dev, bar0, gfid, &mut instance.plugin_rpc) + negotiate_plugin_version(dev, bar0, gfid, &mut instance.plugin_rpc= )?; + instance.configure_plugin(dev, bar0) } =20 /// Stop the plugin and release the instance's firmware and host resou= rces. From nobody Fri Sep 25 10:37:46 2026 Received: from DM5PR21CU001.outbound.protection.outlook.com (mail-centralusazon11011068.outbound.protection.outlook.com [52.101.62.68]) (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 6011940B0F9 for ; Mon, 14 Sep 2026 07:53:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.62.68 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372424; cv=fail; b=q9YNrl6EV3kMGrHi1ckw968bdkuE2hqK+92K9qvNGeERVrCJ41lZMxrEFNNLJgb8YPU6RoZ7Soeu/t4gpY1OUGZulUeeAhbzfgyn1ntso7H0eqJA2M1Z7XQ+3z45Q37RhtdmhpSIM+pPzO1MsLRq+2iCVH780IUs094GRCLPllw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372424; c=relaxed/simple; bh=CqGeEl3RisK1wJv338XIY5gySdTbAFct9PeJGP1cuoA=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=S13qnKPSOXwpUCsE86EcYXiMMM/TdLvVla7ZvTJ8BY6vw+Pi/t7/aexolIJXd9THsESw8gVUliwgNCPcu2QefHSpQNyVNsV98iNoqA8Pa3zrxSieGkFFI2/2FemMSm9j6BOiYfI7wm/k02DR0+5dZ0dVUPpNqRCmgUQEK2FNmRc= 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=sr++l1nW; arc=fail smtp.client-ip=52.101.62.68 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="sr++l1nW" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=r+GvFJ0fp8yCynlY65XKROM+kSqeY5yR5Gra0qUeGSEI5f9R+DzePgT3K5wPTUwxV4msE2pzZh8YCNh8vzZ/PTPbWtp+jEUNpp13qg4e+eoY3MKjMq5YmdDLA1b+HYT4dqbx5xKTUjXPXftc6Tqny5eqyaOhR/z63FXrnaBRTyEhr0FQrjdR1tjQKApBBGy0B/ePd5pOYjjCxo4zGPpC9BtqieaMEgB4WtKD/hfYTO0tO68Fg85UmDciApFa2J2TLkj4ulrSZabIQJd3tFrbVDRH3QsynfU6xm3erQQ7wvRixha6qmtHZ7FFvx5wUn2ocw4nMf5D3zDpcbduBgRtrA== 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=XgPGKaJaQzedG7v4BORr9/mIwwZKzUMtc/1VBN7IcYo=; b=Tx3s6AgcglvSNOyecvg2OBKYdeY8TibXdFNuAyjHvbuAHhrKYCqVzCF7KWvBr+VwciUs58kfWSOUKMZzAyZK6/t1ZK7wJupqv/AyqP0s+8PmHSO2ejSWzPWgvOiaZWQnLkeiWwP4R+oseTTgsAPNd0YeO1dpi6OtrH66Z4R/xWklOisji2W8pkiG8+/4d4IDOjM+eycKGNlDQVfc/BK2MzfvGCUePBJ+HyN4w4g3tma0Lx50G/kZuhjuR2quLvBFPzxN7z9e9ZV7mhb0eZx6acFNxf0o3jYTykhgNmi9+t0M3n/VJmqnHYjC6QQnl5m0gKeiMjov7qK6ofYuaGmotQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=XgPGKaJaQzedG7v4BORr9/mIwwZKzUMtc/1VBN7IcYo=; b=sr++l1nWeVHea3xDpsUs8bqw61DcndxLu6qcmCo7bqllxfHdAkKSvbZ8/MqyvHd/mL7OCAVpa9BWW50+EssAW6GImJ94GwEJjsEWhVRFW3h6gd1GTNwOdWnXu2hd6m9r0bMhi1q+Sd98eiltykQJMkDd71zo8ZDNe4y0W+JdKrTxQEB1KCS2nOc08DByMxO3SDN6P+hsQwNJNLhlZHAlOqqVPhctXmlPckG7t8oMBhpyr0tDjOLVKvrk4NfpM+r1xwXi46INqZNF8pg4gOfRirPENtDgQ2D97dloPk6KxxKc7f/twF1am9ARBvn3UgJkGfzv1OfvGU9ubttAWsSYcQ== Received: from MN0P222CA0018.NAMP222.PROD.OUTLOOK.COM (2603:10b6:208:531::19) by MN2PR12MB4301.namprd12.prod.outlook.com (2603:10b6:208:1d4::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:53:38 +0000 Received: from BN1PEPF00018546.namprd05.prod.outlook.com (2603:10b6:208:531:cafe::1d) by MN0P222CA0018.outlook.office365.com (2603:10b6:208:531::19) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:53:38 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF00018546.mail.protection.outlook.com (10.167.248.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:53:38 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:53:21 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:53:21 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:53:13 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 29/32] gpu: nova-core: vgpu: update the GSP plugin BME state Date: Mon, 14 Sep 2026 10:49:04 +0300 Message-ID: <20260914074907.1399629-30-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF00018546:EE_|MN2PR12MB4301:EE_ X-MS-Office365-Filtering-Correlation-Id: 74fba326-a7b5-449a-a55d-08df1235497f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700016|7416014|376014|23010399003|1800799024|82310400026|11063799006|56012099006|10067099003|22082099003|18002099003|6133799003|3023799007; X-Microsoft-Antispam-Message-Info: o8KV3rI7SyJnbIFwhm38x05/X6CUyG4A9NSdTK39l+/7Jzp/Ho1zvBnVb7CuLYEazNUX7t0EtRbGF5/hvlgcLqBvbtL8vfW3XOKnVZN0ayUYtFYywiEg+EjnqadxfWLsspwduPVc25nLvUsnDSi7IA5kU+kxsp8ZQRj48B5/dfKvrZ5A95/NWnzdTom3z8Quu/ryPVDHxo0GBU0PUe6oTAygDXzgLjv4LnKfe/Z8o0RiJoejhzteHiijmazRrZU4X7akdDcwqplw78IQNnPZEJsyquetVnoYMS9Th/5JB+HUzjLGpUDqq1SRwU6kV+THPPPgPyO1vFST+0XdRoxuYoAwDaapfEVCqAdNuVPE9NsIjV9LwqiezJ/ozr8K0ZCMm37KMht5bzMuLqo5InjkS3ffli8jpQjGZJKXfpybBeB8fCO3iTffglnJ8y1lL5FsPrxIb93njnvnGAOzFdurBdAB7LLRIILvOjY7yQlLddzD9Z9SZeRZK+95S4YhJAx3Qqsdnn/OWfiQ0bToJX6ly1hPbpOsGNYgPNt3ioSCXdcAIiChriE8cicJ6PCrIrZ6JmT0MqP8PsmAUVJBJ1kW4c4dWSl3yXmH22VJKsRHJUPE6QHwcKM2WhkAAzDuOrNzjccZR/bbeJlWuDBGgERUW+oITZdNqMtTNuXYltaFbfJH7TFjgUq4M1sVGFLMMCzXIuQDyuaVixxSHkhxNTkN/Q== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(36860700016)(7416014)(376014)(23010399003)(1800799024)(82310400026)(11063799006)(56012099006)(10067099003)(22082099003)(18002099003)(6133799003)(3023799007);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: FVUroLh0QzilGKQZ/clD+vd37Upqdr4pTk+ewfjt5qivhf66qgWsBsds4KcHzRvJ5X6uc2N2eTA4MXgNwlY3xPGgGHJj0LenoqJ39WQvd/u7tDZoXBwXLpv4Mw+IrVtaR7R/JMCypgBAuMNT7chJgVYfG/KJLQ9/v2+8jID2OoJaD6Ye8edcBFaMKQ69jHXvXwQM+QBKWe2ARPIQxn3W6ZwHUO8QBZaEWT4FpBeemLCCyzBSyxbf0sBT2kQMfLp+5ikVXBu81eVW883xgSyc0hu4e2Fc/6+cPRdtlcFFTc4nucmIs8vd+OkQswwBOh5EjLTix9/Qj/c7FDh9/D1T+Fxb3E9hBwC5kURs1QbT0LZI7/CB67g4Wb5Zb9joismlGGAZ3yEz80wYWfGO6It2Q90FhbKj62+EnpGTwpVFKey5ThEgGH2lrLgQEw2ChVlC X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:53:38.3684 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 74fba326-a7b5-449a-a55d-08df1235497f X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF00018546.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: MN2PR12MB4301 Content-Type: text/plain; charset="utf-8" The vGPU manager reports the enabled bus-mastering state to the GSP plugin after its initial configuration. The guest can then use the vGPU from now on. Add the BME state request and NVKV encoder, and send the enabled state after configuration succeeds. Co-developed-by: Eliot Courtney Signed-off-by: Eliot Courtney Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/vgpu/commands.rs | 14 ++++++++++++++ drivers/gpu/nova-core/vgpu/fw/commands.rs | 22 ++++++++++++++++++++++ drivers/gpu/nova-core/vgpu/instance.rs | 4 +++- 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/nova-core/vgpu/commands.rs b/drivers/gpu/nova-core= /vgpu/commands.rs index 2089c91b648e..7bfde85ad35a 100644 --- a/drivers/gpu/nova-core/vgpu/commands.rs +++ b/drivers/gpu/nova-core/vgpu/commands.rs @@ -37,6 +37,8 @@ VgpuProperties, // }; =20 +use super::fw::commands::encode_plugin_set_bme; + use super::fw::{ GMCAPI_CMD_BOOTLOAD_GSP_VGPU_PLUGIN_TASK, GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_RESOURCES, @@ -177,3 +179,15 @@ pub(super) fn send_plugin_config( config, ) } + +/// Update the bus-mastering state reported to the GSP plugin. +pub(super) fn set_plugin_bme( + dev: &device::Device, + bar0: Bar0<'_>, + gfid: Gfid, + rpc: &mut PluginRpc<'_, '_>, + enable: bool, +) -> Result { + let bme =3D encode_plugin_set_bme(enable)?; + rpc.rpc_call_nvkv(dev, bar0, gfid, RpcMessage::UpdateBmeState, &bme) +} diff --git a/drivers/gpu/nova-core/vgpu/fw/commands.rs b/drivers/gpu/nova-c= ore/vgpu/fw/commands.rs index 0386c8178962..7030479441e8 100644 --- a/drivers/gpu/nova-core/vgpu/fw/commands.rs +++ b/drivers/gpu/nova-core/vgpu/fw/commands.rs @@ -33,6 +33,7 @@ pub(in crate::vgpu) enum RpcMessage { VersionNegotiation =3D bindings::MESSAGE_NV_VGPU_CPU_RPC_MSG_VERSION_N= EGOTIATION, SetupConfigParamsAndInit =3D bindings::MESSAGE_NV_VGPU_CPU_RPC_MSG_SET= UP_CONFIG_PARAMS_AND_INIT, + UpdateBmeState =3D bindings::MESSAGE_NV_VGPU_CPU_RPC_MSG_UPDATE_BME_ST= ATE, } =20 bitfield! { @@ -385,3 +386,24 @@ pub(in crate::vgpu) fn encode_plugin_config_params( request.encode(&mut encoder)?; Ok(encoder.finish()) } + +nvkv_encode! { + struct PluginSetBmeRequest { + bme_enable: Key, + } +} + +impl PluginSetBmeRequest { + const BME_ENABLE_KEY: KeyId =3D 0x0100; +} + +/// Encodes a plugin BME state update using the typed NVKV schema. +pub(in crate::vgpu) fn encode_plugin_set_bme(enable: bool) -> Result { + let request =3D PluginSetBmeRequest { + bme_enable: enable.into(), + }; + + let mut encoder =3D Encoder::new(); + request.encode(&mut encoder)?; + Ok(encoder.finish()) +} diff --git a/drivers/gpu/nova-core/vgpu/instance.rs b/drivers/gpu/nova-core= /vgpu/instance.rs index c3ec24f48682..5d71de0ad108 100644 --- a/drivers/gpu/nova-core/vgpu/instance.rs +++ b/drivers/gpu/nova-core/vgpu/instance.rs @@ -48,6 +48,7 @@ send_cleanup, send_plugin_config, send_shutdown, + set_plugin_bme, Dbdf, VgpuProperties, // }; @@ -390,7 +391,8 @@ pub(super) fn activate_instance( =20 instance.plugin_rpc.init_rpc()?; negotiate_plugin_version(dev, bar0, gfid, &mut instance.plugin_rpc= )?; - instance.configure_plugin(dev, bar0) + instance.configure_plugin(dev, bar0)?; + set_plugin_bme(dev, bar0, gfid, &mut instance.plugin_rpc, true) } =20 /// Stop the plugin and release the instance's firmware and host resou= rces. From nobody Fri Sep 25 10:37:46 2026 Received: from PH8PR06CU001.outbound.protection.outlook.com (mail-westus3azon11012013.outbound.protection.outlook.com [40.107.209.13]) (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 519D038F928 for ; Mon, 14 Sep 2026 07:53:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.209.13 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372440; cv=fail; b=euTKkf1CE8hDRkjvwWV5k5kxbw8rsbN1SxQr+c8H0DmWDpfkUJYie5gyvzheMGPHutIFJHqI4XqpW3mJDHIRXtAIK/c+IkreLxh+49aFNQ8TthLRfl3+mrEqyEVj1/zKSIFW77HRSZY6dzpE1gBxWupOUgiIv426/bJYiZfxT90= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372440; c=relaxed/simple; bh=XARDWyeyXLIDO/SIfo3KM73SsJtaRCyDx0rSeSl97FU=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Pjx1r/G6NEcKqt4/U3gAA+N1mEqEEphQyGwqQuiQqacsEnuy+Jdx5uHC4MsMXXefctz5pTHZC6m7p/qKrinGRwSTZrB8BvvrHgx2ddlixur5jk+p8KZbmac/XDXGrpC4lqkLmPtha0ntdMrlp8BfxPXrlglR3bnCKkT5HiiDaiw= 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=S6Nkha5O; arc=fail smtp.client-ip=40.107.209.13 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="S6Nkha5O" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=zB/E5CkZtC//aPBnB4S6vRvLbimo68l7DaCYWsQGLs+H7KOnP2Fnpj46RIxGc3gOWxAt9aiyVYZd5LHp4zPD5rgLrfWP+tRJfovb3bNKrrLKxgAwOv+lro0IlLjZRb4o6LyyLmNyeIBIakdbQKkNy6KSSw+6Cs1cGR3I9vAIPi4lueBvRU6c9wKgOg0WE7FF2B6E2sJRyyekr3uRON6lOCkrRZKYCyjeUmG3FPgggBFcGyn9go44W2dhXDMx6x7mH80sOmajEELohh02dusxFNVZLaa0yLPv4D89JiQgaNE0/8QP14qusvrA99HZBnf5tAojKT/QHhvpAtUVTQDU9Q== 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=AoB6QZ+5hsCPq5OxN5PUH3kZcm2aPrYLayxVw8JycCM=; b=omHilIRlkU4Wo19gSIBHYCH/ff+FoUCe6WawpOknXdIW7TSR5NBovII57hWOPfmq1jFzCwzkrPIiwhbGVY4D751fQr8EcmpzTVvSFTOInPc/VOc4KGGZa96LTXFtb3AdrhQm0HEXLi5IpFeCU1YSpkBCClsmAbAqVZaB/XaV7CcE47MBWztgVKN/kwegcJ/VEUYqET3lfDb3fZQycYWpckzovibE+W+ZRaHWmiVeWgjDngsugRWjK9yAKVaNPXmyCIqorEdJHgt2RqUtwOX/n0lrSOdnolXAXnwP3BM3z1GdMCFvrGMBVwHqpN7wXBDUQ39AdHR606Sy8ej1JT8yFg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=AoB6QZ+5hsCPq5OxN5PUH3kZcm2aPrYLayxVw8JycCM=; b=S6Nkha5OFVJ9Naq9L5e50zj7Jg2BDq0UawQsFTcXAltjM1orJ8CdaR2bNLWea6C0//RbdF9N44BJj457IHTgwABVAcLEZOceSDuB9LRw+oQeyhjqv1ZVHDX9tK/+uFcU3UdqUSQ7blZnsf45dMsxWaBfVEBOJMJVCSDHyw+eK/M0+db57+gxkl0Hb6uuBTCkKgzhrST9SGn25jkVrSa7y4Rspq2YqFiVvJZZvdgvgGUeZeFpCuG2NFw+BWVb9Suia2n09wpGqRTNzrnmNGkmGL8SXvrCX0fOsy2HatYrPD8kPvNu46GtGp2ID57ib/OvXgNcZjZvKILhToJ/0gUkXg== Received: from CH0P223CA0010.NAMP223.PROD.OUTLOOK.COM (2603:10b6:610:116::20) by CH3PR12MB7618.namprd12.prod.outlook.com (2603:10b6:610:14c::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:53:47 +0000 Received: from DS2PEPF000061C2.namprd02.prod.outlook.com (2603:10b6:610:116:cafe::5c) by CH0P223CA0010.outlook.office365.com (2603:10b6:610:116::20) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:53:47 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by DS2PEPF000061C2.mail.protection.outlook.com (10.167.23.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:53:47 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:53:31 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:53:29 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:53:21 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 30/32] gpu: nova-core: vgpu: scrub guest VRAM with CeUtils Date: Mon, 14 Sep 2026 10:49:05 +0300 Message-ID: <20260914074907.1399629-31-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PEPF000061C2:EE_|CH3PR12MB7618:EE_ X-MS-Office365-Filtering-Correlation-Id: 2762ea86-18e9-49f6-dcff-08df12354f02 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|82310400026|7416014|376014|36860700016|23010399003|6133799003|22082099003|18002099003|3023799007|11063799006|5023799004|10067099003|56012099006; X-Microsoft-Antispam-Message-Info: obpTU3dhnFj7bFMa5ufLl6LBA1KGt084LeI/Fl+kAmqVCzsvVwNqvWi40+VQ8jrZ9A3320FsbQEp7aa1cxwhQM9UCZ+1n5rv9n0jXG9lHkfaR7iM+M/e6c+MD8uPiTBG/F/2sf5rWzQ/aPyGNkHEHnivo1YZYZkksUWt5VyYq9Q6QT75FBIK8iKRb0ef+MdWsJK+gCsyF+Xksy8ReY9T72cf9faGlLW0dtUq8hde3pk8xisPh3cLh6Ac2TPD/cy1rq9j2dbBMcVKzFk+EC6c2J37LI4ymIN1qmhzN9+DleZWADPJtWBfzyhrWd6C9gezwHi//Tz5OmMBRVaIuCbG60rua9Ezx+cBUUwnkl4PTmYBd7Wah/hREQza6yvGxbhEwv8LJXrV9JmIqon8WZTUMO17VC26hKWJXZmMkme0VXNcTLUEhYSXJmxaz0U8B9q2k5eNgEYnNz3p0O8YeeJjZyoWvsdXkbFIHMIkgwVKGkGxSE+07Lv0oee7+GFOWtbTTPO6MjPkr0t6aFqqLLvyG+IBFryorcKSTh8K6GEFTm9uUy6Z0A2gSu9z+IoQE/gjPaBygnFVybm/dZoBS5k9ItYX9/ZO+TAORbMu2Ur0UNTRTrjujvu2ElaDclyBTv9GXxPUVDxUuo8eT9uRRwEMXS4E+8af8PTlXxxaHH7o4js/HChj9SEUf3ZFvkQ33+RxMUq1x8mNtJieXSzZqYoWxg== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(1800799024)(82310400026)(7416014)(376014)(36860700016)(23010399003)(6133799003)(22082099003)(18002099003)(3023799007)(11063799006)(5023799004)(10067099003)(56012099006);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: wMyoim5Gi+9L2nz1SflxWhueOElEywDl89w/FSO1dud6khhfahgSTcrM3CIARiR5XjRP0bfXDfAtiFmbc950/dwMM9N2OL/7oMye+S44KkMh987sdyfBqsdS4u5ObfsIQrBAqp2XPcdrA2UFppBA0qvt7y47mVW8Z2awrukiflV8oGemSVjTS6HtP5u7cBGdnYMFQjPjmyytUrZSCq+E72fjVuLPAWPwSnA67LcZeJgsfqPrWNb4r4A5V32cx3H8SzztD72eKaQRfHHZ3vjURi+KVKvwu4bMPyfRBS4HteQWeHM3W6IwKfKzdcDME3Iku2V35Nocyvp9cQq1Dhq++X/goQYGetQvgxhmuOOU9LUsPZPJfP2pnlr4z2U2eYdFKXHXKgnD6q6uUCQnE+TkAe4tP9cnXBnyDEsviicC3KAzO1jyAckDydbrxKAUrldC X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:53:47.6626 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2762ea86-18e9-49f6-dcff-08df12354f02 X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DS2PEPF000061C2.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH3PR12MB7618 Content-Type: text/plain; charset="utf-8" Guest VRAM can retain guest data when an instance is reused. Add a per-instance Copy Engine utility, CeUtils, that asks GSP-RM to scrub guest VRAM and verifies completion through a hardware semaphore page. The vGPU manager scrubs guest VRAM immediately after allocating it and after shutting an instance down, before returning it to the allocator. Reserve the last channel ID in each instance range for CeUtils and report the remaining channel count to the plugin. Keep failed initialization in the instance registry while firmware ownership or scrub completion is uncertain. Signed-off-by: Zhi Wang --- .../gpu/nova-core/gsp/fw/r000_00/bindings.rs | 1 + drivers/gpu/nova-core/vgpu.rs | 1 + drivers/gpu/nova-core/vgpu/commands.rs | 142 ++++++++++++++- drivers/gpu/nova-core/vgpu/fw.rs | 11 ++ drivers/gpu/nova-core/vgpu/fw/commands.rs | 48 ++++++ drivers/gpu/nova-core/vgpu/instance.rs | 61 ++++++- drivers/gpu/nova-core/vgpu/scrubber.rs | 162 ++++++++++++++++++ 7 files changed, 416 insertions(+), 10 deletions(-) create mode 100644 drivers/gpu/nova-core/vgpu/scrubber.rs diff --git a/drivers/gpu/nova-core/gsp/fw/r000_00/bindings.rs b/drivers/gpu= /nova-core/gsp/fw/r000_00/bindings.rs index 3cc718bb2ab8..333256ea8a04 100644 --- a/drivers/gpu/nova-core/gsp/fw/r000_00/bindings.rs +++ b/drivers/gpu/nova-core/gsp/fw/r000_00/bindings.rs @@ -851,6 +851,7 @@ fn default() -> Self { } } } +pub const NV_ADDR_FBMEM: u32 =3D 2; pub const GSP_PLUGIN_BOOTLOADED: u32 =3D 1315261039; pub const VGPU_CPU_GSP_CTRL_BUFF_VERSION: u32 =3D 2; pub const VGPU_CPU_GSP_CTRL_BUFF_REGION_SIZE: u32 =3D 4096; diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs index 221a2804f5da..407accc05139 100644 --- a/drivers/gpu/nova-core/vgpu.rs +++ b/drivers/gpu/nova-core/vgpu.rs @@ -28,6 +28,7 @@ mod gsp_plugin_rpc; mod hal; mod instance; +mod scrubber; mod vram; =20 /// vGPU state detected during GPU construction. diff --git a/drivers/gpu/nova-core/vgpu/commands.rs b/drivers/gpu/nova-core= /vgpu/commands.rs index 7bfde85ad35a..63b6f0e3d862 100644 --- a/drivers/gpu/nova-core/vgpu/commands.rs +++ b/drivers/gpu/nova-core/vgpu/commands.rs @@ -8,6 +8,7 @@ =20 use kernel::{ device, + num::casts::usize_into_u32, prelude::*, time::Delta, transmute::AsBytes, // @@ -22,7 +23,10 @@ }, }; =20 -use crate::driver::Bar0; +use crate::{ + driver::Bar0, + mm::PAGE_SIZE, // +}; =20 use super::{ fw::RpcMessage, @@ -48,6 +52,20 @@ GMCAPI_CMD_SHUTDOWN_GSP_VGPU_PLUGIN_TASK_COMPLETE, // }; =20 +use super::fw::{ + commands::{ + AllocCeutilsRequest, + AllocCeutilsResponse, + FreeCeutilsRequest, + ScrubGuestFbRequest, + ScrubGuestFbResponse, // + }, + GMCAPI_CMD_VGPU_MGR_ALLOC_GSP_CEUTILS, + GMCAPI_CMD_VGPU_MGR_FREE_GSP_CEUTILS, + GMCAPI_CMD_VGPU_MGR_SCRUB_GUEST_FB, + NV_ADDR_FBMEM, // +}; + /// Query the vGPU type assigned to a VF by its DBDF. #[expect(dead_code)] pub(super) fn query_assigned_vf_type(cmdq: &Cmdq<'_>, dbdf: Dbdf) -> Resul= t { @@ -191,3 +209,125 @@ pub(super) fn set_plugin_bme( let bme =3D encode_plugin_set_bme(enable)?; rpc.rpc_call_nvkv(dev, bar0, gfid, RpcMessage::UpdateBmeState, &bme) } + +/// Whether a failed allocation may still have transferred CHID ownership = to firmware. +pub(super) enum CeUtilsAllocError { + /// A matching firmware response explicitly rejected the allocation. + NotOwned(Error), + /// The request may have completed despite a transport or response-val= idation error. + MayOwn(Error), +} + +/// Allocate a CeUtils channel and validate its semaphore description. +pub(super) fn alloc_ceutils( + dev: &device::Device, + cmdq: &Cmdq<'_>, + gfid: Gfid, + chid: u32, +) -> core::result::Result { + let request =3D AllocCeutilsRequest { + gfid: gfid.0.to_le(), + fixed_chid: chid.to_le(), + force_ceid: u32::MAX.to_le(), + swizz_id: 0, + }; + + dev_dbg!(dev, "alloc CeUtils: gfid=3D{} chid=3D{}\n", gfid.0, chid,); + + let response =3D cmdq + .send_gmc_and_receive( + GMCAPI_CMD_VGPU_MGR_ALLOC_GSP_CEUTILS, + ::as_bytes(&request), + usize_into_u32::<{ size_of::() }>(), + ) + .map_err(CeUtilsAllocError::MayOwn)?; + if response.status !=3D 0 { + return Err(CeUtilsAllocError::NotOwned(EIO)); + } + + (|| { + let bytes =3D response + .payload + .get(..size_of::()) + .ok_or(EMSGSIZE)?; + let response =3D AllocCeutilsResponse::read_from_bytes(bytes).map_= err(|_| EINVAL)?; + let semaphore_address =3D u64::from_le(response.semaphore_address); + let semaphore_aperture =3D u32::from_le(response.semaphore_apertur= e); + let page_size =3D u64::try_from(PAGE_SIZE).map_err(|_| EOVERFLOW)?; + + if semaphore_address =3D=3D 0 + || !semaphore_address.is_multiple_of(page_size) + || semaphore_aperture !=3D NV_ADDR_FBMEM + { + return Err(EINVAL); + } + + dev_dbg!( + dev, + "alloc CeUtils: gfid=3D{} semaphore=3D{:#x}\n", + gfid.0, + semaphore_address, + ); + Ok(semaphore_address) + })() + .map_err(CeUtilsAllocError::MayOwn) +} + +/// Release a CeUtils allocation, including one whose allocation reply was= lost. +pub(super) fn free_ceutils( + dev: &device::Device, + cmdq: &Cmdq<'_>, + gfid: Gfid, +) -> Result { + let request =3D FreeCeutilsRequest { + gfid: gfid.0.to_le(), + }; + + dev_dbg!(dev, "free CeUtils: gfid=3D{}\n", gfid.0); + cmdq.send_gmc_and_check_status( + GMCAPI_CMD_VGPU_MGR_FREE_GSP_CEUTILS, + ::as_bytes(&request), + ) +} + +/// Submit an asynchronous guest FB scrub and return its work identifier. +pub(super) fn submit_ceutils_scrub( + dev: &device::Device, + cmdq: &Cmdq<'_>, + gfid: Gfid, + fb_offset: u64, + fb_size: u64, +) -> Result { + let request =3D ScrubGuestFbRequest { + gfid: gfid.0.to_le(), + reserved: 0, + fb_offset: fb_offset.to_le(), + fb_size: fb_size.to_le(), + }; + + dev_dbg!( + dev, + "submit scrub: gfid=3D{} offset=3D{:#x} size=3D{:#x}\n", + gfid.0, + fb_offset, + fb_size, + ); + + let response =3D cmdq.send_gmc_and_receive( + GMCAPI_CMD_VGPU_MGR_SCRUB_GUEST_FB, + ::as_bytes(&request), + usize_into_u32::<{ size_of::() }>(), + )?; + if response.status !=3D 0 { + return Err(EIO); + } + + let bytes =3D response + .payload + .get(..size_of::()) + .ok_or(EMSGSIZE)?; + let response =3D ScrubGuestFbResponse::read_from_bytes(bytes).map_err(= |_| EINVAL)?; + let work_id =3D u32::try_from(u64::from_le(response.work_id)).map_err(= |_| EOVERFLOW)?; + + Ok(work_id) +} diff --git a/drivers/gpu/nova-core/vgpu/fw.rs b/drivers/gpu/nova-core/vgpu/= fw.rs index 6cec92c9b505..795ce4855586 100644 --- a/drivers/gpu/nova-core/vgpu/fw.rs +++ b/drivers/gpu/nova-core/vgpu/fw.rs @@ -27,6 +27,8 @@ VGPU_CPU_GSP_VGPU_TASK_LOG_BUFF_REGION_SIZE, // }; =20 +pub(super) use bindings::NV_ADDR_FBMEM; + pub(super) use commands::RpcMessage; =20 pub(super) const GMCAPI_CMD_QUERY_ASSIGNED_VF_VGPU_TYPE: u32 =3D @@ -47,6 +49,15 @@ pub(super) const GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_RESOURCES: u32 =3D bindings::GMCAPI_COMMANDS_GMCAPI_CMD_CLEANUP_GSP_VGPU_PLUGIN_RESOURCES; =20 +pub(super) const GMCAPI_CMD_VGPU_MGR_ALLOC_GSP_CEUTILS: u32 =3D + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_MGR_ALLOC_GSP_CEUTILS; + +pub(super) const GMCAPI_CMD_VGPU_MGR_FREE_GSP_CEUTILS: u32 =3D + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_MGR_FREE_GSP_CEUTILS; + +pub(super) const GMCAPI_CMD_VGPU_MGR_SCRUB_GUEST_FB: u32 =3D + bindings::GMCAPI_COMMANDS_GMCAPI_CMD_VGPU_MGR_SCRUB_GUEST_FB; + /// State observed in the response buffer for an expected RPC sequence. pub(super) enum RpcResponse { Pending { diff --git a/drivers/gpu/nova-core/vgpu/fw/commands.rs b/drivers/gpu/nova-c= ore/vgpu/fw/commands.rs index 7030479441e8..aabbf0987daa 100644 --- a/drivers/gpu/nova-core/vgpu/fw/commands.rs +++ b/drivers/gpu/nova-core/vgpu/fw/commands.rs @@ -407,3 +407,51 @@ pub(in crate::vgpu) fn encode_plugin_set_bme(enable: b= ool) -> Result() =3D=3D 16); + +#[repr(C)] +#[derive(FromBytes)] +pub(in crate::vgpu) struct AllocCeutilsResponse { + pub(in crate::vgpu) semaphore_address: u64, + pub(in crate::vgpu) semaphore_aperture: u32, + _reserved: u32, +} + +static_assert!(size_of::() =3D=3D 16); + +#[repr(C)] +#[derive(IntoBytes, zerocopy_derive::Immutable)] +pub(in crate::vgpu) struct FreeCeutilsRequest { + pub(in crate::vgpu) gfid: u32, +} + +static_assert!(size_of::() =3D=3D 4); + +#[repr(C)] +#[derive(IntoBytes, zerocopy_derive::Immutable)] +pub(in crate::vgpu) struct ScrubGuestFbRequest { + pub(in crate::vgpu) gfid: u32, + pub(in crate::vgpu) reserved: u32, + pub(in crate::vgpu) fb_offset: u64, + pub(in crate::vgpu) fb_size: u64, +} + +static_assert!(size_of::() =3D=3D 24); + +#[repr(C)] +#[derive(FromBytes)] +pub(in crate::vgpu) struct ScrubGuestFbResponse { + pub(in crate::vgpu) work_id: u64, +} + +static_assert!(size_of::() =3D=3D 8); diff --git a/drivers/gpu/nova-core/vgpu/instance.rs b/drivers/gpu/nova-core= /vgpu/instance.rs index 5d71de0ad108..bb01d4088b5e 100644 --- a/drivers/gpu/nova-core/vgpu/instance.rs +++ b/drivers/gpu/nova-core/vgpu/instance.rs @@ -33,6 +33,7 @@ use super::{ gsp_plugin_comm::CommBufferRegion, gsp_plugin_rpc::PluginRpc, + scrubber::CeUtils, vram::{ VgpuVramLayout, VgpuVramSlot, @@ -42,6 +43,7 @@ }; =20 use super::commands::{ + free_ceutils, negotiate_plugin_version, query_vgpu_properties, send_bootload, @@ -49,6 +51,7 @@ send_plugin_config, send_shutdown, set_plugin_bme, + CeUtilsAllocError, Dbdf, VgpuProperties, // }; @@ -142,6 +145,8 @@ pub(super) struct VgpuInstance<'gpu> { num_plugin_channels: u32, vram_slot: VgpuVramSlot, pub(super) plugin_rpc: PluginRpc<'gpu, 'gpu>, + ceutils: Option, + initialized: bool, needs_teardown: bool, } =20 @@ -204,7 +209,7 @@ fn configure_plugin(&mut self, dev: &device::Device, bar0: Bar0<' self.dbdf, self.vgpu_type.vgpu_type_id(), self.vm_pid, - u32::try_from(self.chids.len()).map_err(|_| EOVERFLOW)?, + u32::try_from(self.chids.len().checked_sub(1).ok_or(EINVAL)?).= map_err(|_| EOVERFLOW)?, self.num_plugin_channels, )?; =20 @@ -291,9 +296,11 @@ fn release_instance(&mut self, instance: VgpuInstance<= 'gpu>, mm: &mut GpuMm<'_>) result } =20 - /// Allocate resources and register a new inactive vGPU instance. + /// Allocate resources, scrub the framebuffer and register an inactive= instance. pub(super) fn allocate_instance( &mut self, + dev: &device::Device, + cmdq: &Cmdq<'_>, bar_user: &'gpu BarUser<'gpu>, mm: &mut GpuMm<'_>, vgpu: &VgpuManager<'gpu>, @@ -331,12 +338,14 @@ pub(super) fn allocate_instance( let num_chid =3D vgpu .total_channels() .checked_div(vgpu_type.max_instance) - .filter(|count| *count !=3D 0) + .filter(|count| *count > 1) .ok_or(EINVAL)?; let chids =3D vgpu.chid_pool.reserve_ids( NonZeroUsize::new(usize::try_from(num_chid).map_err(|_| EOVERF= LOW)?).ok_or(EINVAL)?, Alignment::SZ_1, )?; + let ceutils_chid =3D + u32::try_from(chids.end.checked_sub(1).ok_or(EINVAL)?).map_err= (|_| EOVERFLOW)?; let layout =3D VgpuVramLayout { type_id: vgpu_type.vgpu_type_id, max_slots: vgpu_type.max_instance, @@ -362,15 +371,39 @@ pub(super) fn allocate_instance( num_plugin_channels: 3, vram_slot, plugin_rpc: PluginRpc::new(comm), + ceutils: None, + initialized: false, needs_teardown: false, }; - match self.instances.push_within_capacity(instance) { - Ok(()) =3D> Ok(gfid), + // Register ownership before firmware work so an uncertain result = leaves + // the reservations reachable and unavailable to another instance. + let index =3D self.instances.len(); + if let Err(error) =3D self.instances.push_within_capacity(instance= ) { + self.release_instance(error.0, mm)?; + return Err(EIO); + } + + let ceutils =3D match CeUtils::allocate(dev, cmdq, gfid, ceutils_c= hid) { + Ok(ceutils) =3D> ceutils, Err(error) =3D> { - self.release_instance(error.0, mm)?; - Err(EIO) + let error =3D match error { + CeUtilsAllocError::NotOwned(error) =3D> error, + CeUtilsAllocError::MayOwn(error) =3D> { + dev_err!(dev, "CeUtils allocation failed: {:?}\n",= error); + return Err(error); + } + }; + let instance =3D self.instances.remove(index).map_err(|_| = EIO)?; + self.release_instance(instance, mm)?; + return Err(error); } - } + }; + let instance =3D self.instances.get_mut(index).ok_or(EIO)?; + let result =3D ceutils.scrub_guest_fb(dev, cmdq, bar_user, mm, &in= stance.vram_slot.fbmem); + instance.ceutils =3D Some(ceutils); + result?; + instance.initialized =3D true; + Ok(gfid) } =20 /// Boot and configure the GSP plugin for a registered instance. @@ -387,6 +420,9 @@ pub(super) fn activate_instance( .iter_mut() .find(|instance| instance.gfid =3D=3D gfid) .ok_or(ENOENT)?; + if !instance.initialized { + return Err(EINVAL); + } instance.bootload(dev, cmdq, fifo_engine_list)?; =20 instance.plugin_rpc.init_rpc()?; @@ -400,6 +436,7 @@ pub(super) fn destroy_instance( &mut self, dev: &device::Device, cmdq: &Cmdq<'_>, + bar_user: &BarUser<'_>, mm: &mut GpuMm<'_>, gfid: Gfid, ) -> Result { @@ -408,8 +445,14 @@ pub(super) fn destroy_instance( .iter() .position(|instance| instance.gfid =3D=3D gfid) .ok_or(ENOENT)?; - let instance =3D &mut self.instances[index]; + let instance =3D self.instances.get_mut(index).ok_or(EIO)?; + instance.initialized =3D false; instance.shutdown(dev, cmdq)?; + if let Some(ceutils) =3D instance.ceutils.as_ref() { + ceutils.scrub_guest_fb(dev, cmdq, bar_user, mm, &instance.vram= _slot.fbmem)?; + } + instance.ceutils =3D None; + free_ceutils(dev, cmdq, gfid)?; if instance.needs_teardown { send_cleanup(dev, cmdq, gfid)?; } diff --git a/drivers/gpu/nova-core/vgpu/scrubber.rs b/drivers/gpu/nova-core= /vgpu/scrubber.rs new file mode 100644 index 000000000000..72c76fd6bbd5 --- /dev/null +++ b/drivers/gpu/nova-core/vgpu/scrubber.rs @@ -0,0 +1,162 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! Per-VM CeUtils guest framebuffer scrubbing. + +use kernel::{ + device, + prelude::*, + time::{ + delay::fsleep, + Delta, + Instant, + Monotonic, // + }, +}; + +use crate::{ + gsp::cmdq::Cmdq, + mm::{ + bar_user::BarUser, + vram::VramRegion, + GpuMm, + Pfn, + VramAddress, // + }, + vgpu::instance::Gfid, // +}; + +use super::commands::{ + self, + CeUtilsAllocError, // +}; + +// Semaphore layout from OpenRM `channel_utils.h`. +const NV_CEUTILS_SEMA_PAGE_MAGIC: u32 =3D 0xce5e_5ea0; + +#[repr(C)] +struct CeUtilsSemaphoreHeader { + magic: u32, + payload: u32, +} + +static_assert!(size_of::() =3D=3D 8); + +const SEMA_PAGE_MAGIC_OFFSET: usize =3D core::mem::offset_of!(CeUtilsSemap= horeHeader, magic); +const SEMA_PAGE_PAYLOAD_OFFSET: usize =3D core::mem::offset_of!(CeUtilsSem= aphoreHeader, payload); + +const SCRUB_REQUEST_SIZE: u64 =3D 4 * 1024 * 1024 * 1024; + +// Host timeout policy; not a firmware ABI value. +const SCRUB_TIMEOUT: Delta =3D Delta::from_secs(5); + +/// A firmware-owned per-VM CeUtils allocation. +/// +/// Submitted scrubs must complete before releasing this allocation or its= framebuffer. +pub(super) struct CeUtils { + gfid: Gfid, + semaphore_address: u64, +} + +impl CeUtils { + pub(super) fn allocate( + dev: &device::Device, + cmdq: &Cmdq<'_>, + gfid: Gfid, + chid: u32, + ) -> core::result::Result { + let semaphore_address =3D commands::alloc_ceutils(dev, cmdq, gfid,= chid)?; + Ok(Self { + gfid, + semaphore_address, + }) + } + + /// Scrub the complete guest framebuffer and wait for semaphore comple= tion. + pub(super) fn scrub_guest_fb( + &self, + dev: &device::Device, + cmdq: &Cmdq<'_>, + bar_user: &BarUser<'_>, + mm: &mut GpuMm<'_>, + fb: &VramRegion, + ) -> Result { + let mut offset =3D fb.address(); + let end =3D offset.checked_add(fb.size()).ok_or(EOVERFLOW)?; + while offset < end { + let size =3D core::cmp::min(SCRUB_REQUEST_SIZE, end - offset); + let work_id =3D commands::submit_ceutils_scrub(dev, cmdq, self= .gfid, offset, size)?; + wait_scrub_complete(bar_user, mm, dev, self.semaphore_address,= work_id)?; + offset =3D offset.checked_add(size).ok_or(EOVERFLOW)?; + } + + Ok(()) + } +} + +/// Poll the GSP-owned CeUtils semaphore page through a temporary BAR1 map. +fn wait_scrub_complete( + bar_user: &BarUser<'_>, + mm: &mut GpuMm<'_>, + dev: &device::Device, + semaphore_address: u64, + work_id: u32, +) -> Result { + let pfn =3D Pfn::from(VramAddress::from_raw(semaphore_address)); + let semaphore_map =3D bar_user.map(mm, &[pfn], false)?; + + let result =3D (|| { + let magic =3D semaphore_map.try_read32(SEMA_PAGE_MAGIC_OFFSET)?; + if magic !=3D NV_CEUTILS_SEMA_PAGE_MAGIC { + dev_warn!( + dev, + "bad CeUtils semaphore magic {:#x}, expected {:#x}\n", + magic, + NV_CEUTILS_SEMA_PAGE_MAGIC, + ); + return Err(EIO); + } + + let start =3D Instant::::now(); + loop { + let value =3D semaphore_map.try_read32(SEMA_PAGE_PAYLOAD_OFFSE= T)?; + if value.wrapping_sub(work_id) < 0x8000_0000 { + dev_dbg!( + dev, + "scrub completed after {:?}: semaphore=3D{:#x}, target= =3D{:#x}\n", + start.elapsed(), + value, + work_id, + ); + return Ok(()); + } + + if start.elapsed() >=3D SCRUB_TIMEOUT { + dev_warn!( + dev, + "scrub timed out: semaphore=3D{:#x}, target=3D{:#x}\n", + value, + work_id, + ); + return Err(ETIMEDOUT); + } + fsleep(Delta::from_millis(1)); + } + })(); + + let cleanup =3D semaphore_map.release(mm); + match result { + Ok(()) =3D> cleanup, + Err(error) =3D> { + if let Err(cleanup_error) =3D cleanup { + dev_err!( + dev, + "failed to release semaphore BAR1 mapping after error = {:?}: {:?}\n", + error, + cleanup_error, + ); + } + Err(error) + } + } +} From nobody Fri Sep 25 10:37:46 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013035.outbound.protection.outlook.com [40.93.196.35]) (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 84EEB40B0E2 for ; Mon, 14 Sep 2026 07:54:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.35 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372448; cv=fail; b=X+EpX4sbIVbhZy4RHnjUwkIoUckNKyeCLM6/vWz8Xpq4SHN5vUXzJkeWlEa4hyX2sYFVJa7fUMCg6939oF4drmBkrWgK1C3QJlTALGnm4r93PaPQCS1jAiVWU1yxJW8pSW4cjdwlYDcnH5AIeE6k78uRq1e8xBa0RsyvANG9WBs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372448; c=relaxed/simple; bh=Pbrg6QKyq7c66a97m1unLkIdtPFqbTxjaNaNtvrdwUc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=jSB0BPIrDZ0xO2iVlATFuGBnxkcsqpaQelVfULac9lUYIX40/rZUXXtHwuHyjJA7Js/5ulwlwivZc6gKOO0A/0Q07kwmhMIwMkq4L7Xf/7WGU7C/uQYRfyjyOU1UtqlxDC6jM//pJpMet52naoBxUr7auqcfpfsPoRLLeeyeLjo= 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=bVmHDtfv; arc=fail smtp.client-ip=40.93.196.35 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="bVmHDtfv" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=qZK5zFsZvD+3CGGvvJ2vgipFH1KT9IJ1vCN9JpKg3qwXF9zusonWdMvtsaQ9N1ghI6Jcozq5L0nRMz2wt/rMJk13yaHtzNVhvVWeuDJmEXljOY2i67LmKhfOZbcUoym3sjCrRcpxZchZVZkytCrA25+IG1TFqfZUeR6SVg3vye1B17GP9Bu21A/x6PDZU7Q9JsW0B0G0pi2zigeBkQPtRiRfVldJsEZs+QjzIgdnM+5nvqucerDQIkacKC9CPPMZa2jTgFWnmPoWUv96OyolBWz/hfgDzpMItBT355JaM2KgOIuv93uNYdDY9L1dECTZv8m8/eGIVo6fLLlbR+8EDg== 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=UIv5VwTkgIqWecryJN/7UPNAEOiSDGtQwoMh5lbiwCo=; b=pyPqIMqUyh81lglsA4/36BZ+pHpzAaKenbDJ37TMrvYpi3c7Ofvkcr6GQYZrLcLPQAko9PnKS48iv87SoMxl7tmQejapw6mlLvE20WyDBtg9mGvJ5z0zdqCq4iPGWhmbur5DOvorMNOH3J0rvHARU5TBSHTKe8fP4Os+UUUo6qZCZwer61RmSKgYdUrhkNH5K1pJQEUzKO0q1d8nIYPQCkcVxnjiP/i1i+yhqFrNc52Df1kl0yT1vYJHXPqVrC1pPUH4RyWS2d4rwfbXv/pI0siLFNG1AsV9XyiRX00Xomb93xOXZ+M7dvpkfjgnQbqoJUgpt3Xu8W0dI9udg4NmrQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.161) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=UIv5VwTkgIqWecryJN/7UPNAEOiSDGtQwoMh5lbiwCo=; b=bVmHDtfvH3V1TsSXN75pN6YX2qxiA2+tnBIo/NeyR+y/PHWBwF4fjaO8RV86HYF4uK1q2nWfETeHiBd4XqfloPckCmnFhPz+cPULtojJ0dtwaHRX56b1c57hqFbIsSc8M3O6ixYSNbkXLNkYq44A7A65KgXQkz357KeCbGHPgfM/nNw3/a/6Z8mYUGmKStzFr2j5J5LCRPfpse/vv24hcHQ7XfH+CmF6XI1qHRbJMbXajmjp5AWwo5qDfRhznHZGue+3eD30Pw9yZlGm+j616IHg0bZfYCJhdmx79PewqsDZlm3ne1AX4oNYSDFVN1O9XIo9wYzh9Sto0ElCzoMzlQ== Received: from BLAPR03CA0180.namprd03.prod.outlook.com (2603:10b6:208:32f::10) by DM4PR12MB7717.namprd12.prod.outlook.com (2603:10b6:8:103::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:53:57 +0000 Received: from BN1PEPF0001854C.namprd05.prod.outlook.com (2603:10b6:208:32f:cafe::2) by BLAPR03CA0180.outlook.office365.com (2603:10b6:208:32f::10) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:53:57 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.161) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.161 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.161; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.161) by BN1PEPF0001854C.mail.protection.outlook.com (10.167.248.11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:53:57 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com (10.129.200.67) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:53:39 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:53:38 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:53:30 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Timur Tabi Subject: [PATCH v2 31/32] gpu: nova-core: add build ID headers to debugfs log buffer dumps Date: Mon, 14 Sep 2026 10:49:06 +0300 Message-ID: <20260914074907.1399629-32-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: BN1PEPF0001854C:EE_|DM4PR12MB7717:EE_ X-MS-Office365-Filtering-Correlation-Id: a5e34d1b-40b6-4f82-02be-08df123554cd X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|376014|7416014|36860700016|23010399003|3023799007|6133799003|56012099006|5023799004|11063799006|18002099003|22082099003|10067099003; X-Microsoft-Antispam-Message-Info: VtSuYQYTxStjyRJPMGbYQB8rZrpmSq1+91AomLHE3Cl9nQwxI3qrtKfNCTNnNfGTCNUTCKseb8+LJcPY++c+vg8ejxhepONwsXRB8So0nhTxDfKq6Q9N4xoF704tLUo6f7+G83Y5AShCsbEvTLDPWNwHloD4Tjt9l1axyPAZ3DLfZ6yIOGptqLGbbjtoZ2zQJNn3eXfPlYAVwfVHcAsds5saWhS3+r8rd9OL2Jucc4OVErRtNFRTWx+80eiwZl3Dzgdq8nCOB/rQR1DjHD/QDyAbXGyrKOPt5t9Z0UKw5S+nx44m7A6G+dYR9uXQDCjN/kxSSGIMoWPaD/BPtM/Bmd6zJbzZlICldFLgiq/K6+nXdlaSpqDsjRPShqJIoybnG3DL/Mrgd9aGXnA/dNPhMcuRpqd5MigQYptotyxvzgeeYmNLuq+jXX7qd3U8R7UDRTv8AN+3Vzj0HkGe/iIp8kVlvPUFvI5XOAq8xoZM/mbNV8XZZaVEeqvGL4sDXzibTjqjbi77vRxDchXTZBtmLRSaBSVh+JeHJGpDgp4SriJNsBmwTVIlVl5vXThRSMAof3X6Ph4PeL3WaVywRBnKfoMKi8ouyvtv5JNQgVoNCiIfy8nSKMAWbvvHfOraH2YLFvZJfdSyWc6sBRjYWIHpDcIShwcVF9Fn/Pxt8bh/0m1rH+0QmFmtuyLuS317eMeASb1btsHOmcrFwK+n3U4EFQ== X-Forefront-Antispam-Report: CIP:216.228.117.161;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge2.nvidia.com;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(376014)(7416014)(36860700016)(23010399003)(3023799007)(6133799003)(56012099006)(5023799004)(11063799006)(18002099003)(22082099003)(10067099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: gTYJ1urjxpv4w8VEhiMMOT8GrblLKhmz5pcH6iZSxV+WoIl2EnJgLzImuMWWDC4nyg/jk9UI7TkkO63XIzR8lkmKK86PU9i8YMFTuGmrPCccmor8t7M+4Zr7jQ7u2jqT8nYeMvTgnmFG2OkFlt/rjeCHK6aBQ9bqFsfR5ac8viAU6app0UOWLa39x54ZurxT7zf+AMC6CTdDPOzM+JUhMoaF0swDDddtAs8FbBq0i+JbeR/nDdSO5ofLgmvwRxNzesim1sZfq5LNnB7O57pvyNjV2UikaTkLfe5EjqbnTUHJS8FjhhCR7ZhyC1q+0offkILfvKJZshpIagX1PLcddARvEgMyI2eV8/05Rw/9W6yhSyBxgB2yel2ZWl0bbWzUqm3siovGcoAD7afjRD5H/VaMU55XNOSIxgZt/iCSXXWK22apCNItO7blLMFRiDWh X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:53:57.3404 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a5e34d1b-40b6-4f82-02be-08df123554cd X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.161];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: BN1PEPF0001854C.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM4PR12MB7717 Content-Type: text/plain; charset="utf-8" From: John Hubbard A raw log buffer dump cannot be decoded without knowing which firmware build produced it, and which GPU and metadata format it belongs to. GSP-RM's own decoder takes that from a header ahead of the data, in the LIBOS_LOG_NVLOG_BUFFER_V2 layout. Prepend that header to each debugfs dump. The build ID comes from the BLID tag of gsp.tlv, so request the metadata once when the GSP manager is created and hand it to the firmware loader rather than requesting it again during boot. A buffer whose build ID is missing serves its contents with no header. zhiw: Keep this tree's borrowed DMA and command queue lifetimes and all six LIBOS log registrations. Borrow the preloaded TLV for initialization independently of the device lifetime. Retain the completed header byte count if the following DMA copy fails. Reviewed-by: Timur Tabi Signed-off-by: John Hubbard --- drivers/gpu/nova-core/firmware.rs | 34 +++++ drivers/gpu/nova-core/firmware/gsp.rs | 16 ++- drivers/gpu/nova-core/gpu.rs | 2 +- drivers/gpu/nova-core/gsp.rs | 199 ++++++++++++++++++++++---- drivers/gpu/nova-core/gsp/boot.rs | 2 +- 5 files changed, 217 insertions(+), 36 deletions(-) diff --git a/drivers/gpu/nova-core/firmware.rs b/drivers/gpu/nova-core/firm= ware.rs index ff5b6d79de22..86c1eb459192 100644 --- a/drivers/gpu/nova-core/firmware.rs +++ b/drivers/gpu/nova-core/firmware.rs @@ -32,6 +32,40 @@ pub(crate) mod riscv; pub(crate) mod tlv; =20 +/// Maximum length of a build ID, matching Open RM's `BUILD_ID_MAX_LENGTH`. +const BUILD_ID_MAX_LENGTH: usize =3D 32; + +/// Build ID extracted from firmware, used to correlate debugfs log buffer= dumps +/// with the correct firmware symbols. +pub(crate) struct BuildId { + bytes: [u8; BUILD_ID_MAX_LENGTH], + len: u8, +} + +impl BuildId { + /// Constructs a [`BuildId`] from raw descriptor bytes. + /// + /// Returns `None` if `data` is empty or exceeds [`BUILD_ID_MAX_LENGTH= `]. + pub(crate) fn from_raw(data: &[u8]) -> Option { + if data.is_empty() || data.len() > BUILD_ID_MAX_LENGTH { + return None; + } + + let mut bytes =3D [0u8; BUILD_ID_MAX_LENGTH]; + bytes[..data.len()].copy_from_slice(data); + + Some(Self { + bytes, + len: data.len() as u8, + }) + } + + /// Returns the build ID bytes. + pub(crate) fn as_bytes(&self) -> &[u8] { + &self.bytes[..usize::from(self.len)] + } +} + /// Structure used to describe some firmwares, notably FWSEC-FRTS. #[repr(C)] #[derive(Debug, Clone, FromBytes)] diff --git a/drivers/gpu/nova-core/firmware/gsp.rs b/drivers/gpu/nova-core/= firmware/gsp.rs index e641f4879a42..5b2f765e77b4 100644 --- a/drivers/gpu/nova-core/firmware/gsp.rs +++ b/drivers/gpu/nova-core/firmware/gsp.rs @@ -6,6 +6,7 @@ Coherent, DmaAddress, // }, + firmware, prelude::*, // }; =20 @@ -14,8 +15,8 @@ radix3::Radix3, riscv::RiscvFirmware, // tlv::{ - request_tlv, // - Tlv, + request_tlv, + Tlv, // }, }, gpu::Chipset, // @@ -36,13 +37,16 @@ pub(crate) struct GspFirmware<'a> { impl<'a> GspFirmware<'a> { /// Loads the GSP firmware binaries, map them into `dev`'s address-spa= ce, and creates the page /// tables expected by the GSP bootloader to load it. - pub(crate) fn new( + pub(crate) fn new<'fw>( dev: &'a device::Device, chipset: Chipset, - ) -> impl PinInit + 'a { + gsp_tlv: &'fw firmware::Firmware, + ) -> impl PinInit + 'fw + where + 'a: 'fw, + { pin_init::pin_init_scope(move || { - let firmware =3D request_tlv(dev, chipset, "gsp")?; - let tlv =3D Tlv::new(firmware.data())?; + let tlv =3D Tlv::new(gsp_tlv.data())?; dev_dbg!(dev, "loaded gsp firmware v{}\n", tlv.get_string(b"VE= RS")?); =20 let (_, fw_vvec) =3D tlv.load_file(dev, chipset)?; diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 61adf412bae7..a750d808fd5b 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -426,7 +426,7 @@ pub(crate) fn new<'a>( =20 vgpu_state: VgpuState::detect(pdev, spec.chipset, fsp.as_m= ut()), =20 - gsp <- Gsp::new(pdev, bar), + gsp <- Gsp::new(pdev, bar, spec.chipset), =20 // This member must be initialized last, so the unload bun= dle can never be dropped // from outside of the constructed `GspResources`, ensurin= g that the unload sequence diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index c961ea029fed..0bf4c8ee96ee 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -12,13 +12,15 @@ CoherentView, DmaAddress, // }, + fs::file, io::{ io_project, io_write, Io, // }, pci, - prelude::*, // + prelude::*, + uaccess::UserSliceWriter, // }; =20 pub(crate) mod cmdq; @@ -43,6 +45,13 @@ sec2::Sec2 as Sec2Falcon, Falcon, // }, + firmware::{ + tlv::{ + request_tlv, + Tlv, // + }, + BuildId, // + }, fsp::Fsp, gpu::Chipset, gsp::{ @@ -101,6 +110,50 @@ fn init(view: CoherentView<'_, Self>, start: DmaAddres= s) -> Result<()> { } } =20 +/// Size of the header prepended to debugfs log buffer dumps. +/// +/// This header makes each dump self-describing so that decoding tools can +/// identify the firmware build, GPU architecture, and metadata format wit= hout +/// out-of-band information. +const LOG_BUFFER_HEADER_SIZE: usize =3D 0x48; + +/// Build a log buffer header from GPU and firmware metadata. +/// +/// Layout (all little-endian): +/// 0x00 gpuArch (u32) +/// 0x04 gpuImpl (u32) +/// 0x08 version (u32) =3D 2 +/// 0x0C buildIdLength (u32) +/// 0x10 taskPrefix[8] +/// 0x18 localToGlobalTimerDelta (u64) =3D 0 +/// 0x20 buildId[32] +/// 0x40 flags (u32) =3D 1 (packed metadata) +/// 0x44 reserved (u32) =3D 0 +fn build_log_buffer_header( + chipset: Chipset, + build_id: &BuildId, + task_prefix: &str, +) -> [u8; LOG_BUFFER_HEADER_SIZE] { + let mut h =3D [0u8; LOG_BUFFER_HEADER_SIZE]; + let chipset_val =3D chipset as u32; + + h[0x00..0x04].copy_from_slice(&(chipset_val >> 4).to_le_bytes()); + h[0x04..0x08].copy_from_slice(&(chipset_val & 0xF).to_le_bytes()); + h[0x08..0x0C].copy_from_slice(&2u32.to_le_bytes()); + + let bid =3D build_id.as_bytes(); + h[0x0C..0x10].copy_from_slice(&(bid.len() as u32).to_le_bytes()); + + let prefix =3D task_prefix.as_bytes(); + let prefix_len =3D prefix.len().min(8); + h[0x10..0x10 + prefix_len].copy_from_slice(&prefix[..prefix_len]); + + h[0x20..0x20 + bid.len()].copy_from_slice(bid); + h[0x40..0x44].copy_from_slice(&1u32.to_le_bytes()); + + h +} + /// The logging buffers are byte queues that contain encoded printf-like /// messages from GSP-RM. They need to be decoded by a special application /// that can parse the buffers. @@ -115,7 +168,13 @@ fn init(view: CoherentView<'_, Self>, start: DmaAddres= s) -> Result<()> { /// then pp points to index into the buffer where the next logging entry w= ill /// be written. Therefore, the logging data is valid if: /// 1 <=3D pp < sizeof(buffer)/sizeof(u64) -struct LogBuffer<'a, const NUM_PAGES: usize>(Coherent<'a, [[u8; GSP_PAGE_S= IZE]; NUM_PAGES]>); +/// +/// When a build ID is available, the debugfs file for this buffer prepends +/// a header so the dump is self-describing. +struct LogBuffer<'a, const NUM_PAGES: usize> { + header: Option<[u8; LOG_BUFFER_HEADER_SIZE]>, + buffer: Coherent<'a, [[u8; GSP_PAGE_SIZE]; NUM_PAGES]>, +} =20 /// A log buffer at the default size, [`RM_LOG_BUFFER_NUM_PAGES`] pages. /// @@ -130,19 +189,71 @@ fn init(view: CoherentView<'_, Self>, start: DmaAddre= ss) -> Result<()> { =20 impl<'a, const NUM_PAGES: usize> LogBuffer<'a, NUM_PAGES> { /// Creates a new `LogBuffer` mapped on `dev`. - fn new(dev: &'a device::Device) -> Result { - let obj =3D Self(Coherent::zeroed(dev, GFP_KERNEL)?); - - let start_addr =3D obj.0.dma_address(); - + fn new( + dev: &'a device::Device, + chipset: Chipset, + build_id: Option<&BuildId>, + task_prefix: &str, + ) -> Result { + let buffer =3D Coherent::zeroed(dev, GFP_KERNEL)?; + + let start_addr =3D buffer.dma_address(); let pte_view =3D io_project!( - obj.0, + buffer, [build: 0][build: size_of::()..][build: ..NUM_PAGES * siz= e_of::()] ) .try_cast::>()?; PteArray::init(pte_view, start_addr)?; =20 - Ok(obj) + let header =3D build_id.map(|bid| build_log_buffer_header(chipset,= bid, task_prefix)); + + Ok(Self { header, buffer }) + } +} + +impl debugfs::BinaryWriter for LogBuffer<'_, NUM_P= AGES> { + fn write_to_slice( + &self, + writer: &mut UserSliceWriter, + offset: &mut file::Offset, + ) -> Result { + if offset.is_negative() { + return Err(EINVAL); + } + + let offset_val: usize =3D (*offset).try_into().map_err(|_| EINVAL)= ?; + let header =3D self.header.as_ref().map_or(&[][..], |h| h.as_slice= ()); + let total_len =3D header.len() + self.buffer.size(); + + if offset_val >=3D total_len { + return Ok(0); + } + + let count =3D (total_len - offset_val).min(writer.len()); + if count =3D=3D 0 { + return Ok(0); + } + + let mut written =3D 0; + + if offset_val < header.len() { + let hdr_count =3D (header.len() - offset_val).min(count); + writer.write_slice(&header[offset_val..offset_val + hdr_count]= )?; + written +=3D hdr_count; + } + + if written < count { + let buf_start =3D offset_val.saturating_sub(header.len()); + let buf_count =3D count - written; + match writer.write_dma(&self.buffer, buf_start, buf_count) { + Ok(()) =3D> written +=3D buf_count, + Err(error) if written =3D=3D 0 =3D> return Err(error), + Err(_) =3D> {} + } + } + + *offset +=3D written as i64; + Ok(written) } } =20 @@ -168,9 +279,11 @@ struct LogBuffers<'a> { /// GSP runtime data. #[pin_data] pub(crate) struct Gsp<'gsp> { + /// Preloaded GSP firmware TLV metadata used during boot. + gsp_tlv: kernel::firmware::Firmware, /// Libos arguments. pub(crate) libos: Coherent<'gsp, [LibosMemoryRegionInitArgument]>, - /// Log buffers, optionally exposed via debugfs. + /// Log buffers for all LIBOS3 tasks, exposed via debugfs. #[pin] logs: debugfs::Scope>, /// Command queue, borrowed by the GSP event interrupt handler. @@ -187,18 +300,30 @@ impl<'gsp> Gsp<'gsp> { pub(crate) fn new( pdev: &'gsp pci::Device, bar: Bar0<'gsp>, + chipset: Chipset, ) -> impl PinInit + 'gsp { pin_init::pin_init_scope(move || { let dev =3D pdev.as_ref(); =20 - let loginit =3D TaskLogBuffer::new(dev)?; - let logintr =3D TaskLogBuffer::new(dev)?; - let logrm =3D TaskLogBuffer::new(dev)?; - let logmnoc =3D TaskLogBuffer::new(dev)?; - let logroot =3D SmallLogBuffer::new(dev)?; - let logrmon =3D SmallLogBuffer::new(dev)?; + let gsp_tlv =3D request_tlv(dev, chipset, "gsp")?; + let tlv =3D Tlv::new(gsp_tlv.data())?; + let build_id =3D tlv.get_bytes(b"BLID").ok().and_then(BuildId:= :from_raw); + if build_id.is_none() { + dev_warn!( + pdev, + "GSP firmware build ID not found, log buffer headers o= mitted\n" + ); + } + + let loginit =3D TaskLogBuffer::new(dev, chipset, build_id.as_r= ef(), "INIT")?; + let logintr =3D TaskLogBuffer::new(dev, chipset, build_id.as_r= ef(), "INTR")?; + let logrm =3D TaskLogBuffer::new(dev, chipset, build_id.as_ref= (), "RM")?; + let logmnoc =3D TaskLogBuffer::new(dev, chipset, build_id.as_r= ef(), "MNOC")?; + let logroot =3D SmallLogBuffer::new(dev, chipset, build_id.as_= ref(), "ROOT")?; + let logrmon =3D SmallLogBuffer::new(dev, chipset, build_id.as_= ref(), "RMON")?; =20 Ok(try_pin_init!(Self { + gsp_tlv, cmdq <- Cmdq::new(dev, bar), rm_state_monitor: Coherent::zeroed(dev, GFP_KERNEL)?, rmargs: Coherent::init( @@ -213,12 +338,30 @@ pub(crate) fn new( GFP_KERNEL, )?; =20 - libos.init_at(0, LibosMemoryRegionInitArgument::new("L= OGINIT", &loginit.0))?; - libos.init_at(1, LibosMemoryRegionInitArgument::new("L= OGINTR", &logintr.0))?; - libos.init_at(2, LibosMemoryRegionInitArgument::new("L= OGRM", &logrm.0))?; - libos.init_at(3, LibosMemoryRegionInitArgument::new("L= OGMNOC", &logmnoc.0))?; - libos.init_at(4, LibosMemoryRegionInitArgument::new("L= OGROOT", &logroot.0))?; - libos.init_at(5, LibosMemoryRegionInitArgument::new("L= OGRMON", &logrmon.0))?; + libos.init_at( + 0, + LibosMemoryRegionInitArgument::new("LOGINIT", &log= init.buffer), + )?; + libos.init_at( + 1, + LibosMemoryRegionInitArgument::new("LOGINTR", &log= intr.buffer), + )?; + libos.init_at( + 2, + LibosMemoryRegionInitArgument::new("LOGRM", &logrm= .buffer), + )?; + libos.init_at( + 3, + LibosMemoryRegionInitArgument::new("LOGMNOC", &log= mnoc.buffer), + )?; + libos.init_at( + 4, + LibosMemoryRegionInitArgument::new("LOGROOT", &log= root.buffer), + )?; + libos.init_at( + 5, + LibosMemoryRegionInitArgument::new("LOGRMON", &log= rmon.buffer), + )?; libos.init_at(6, LibosMemoryRegionInitArgument::new("R= MARGS", rmargs))?; =20 libos.into() @@ -244,12 +387,12 @@ pub(crate) fn new( .expect("DEBUGFS_ROOT not initialized"); =20 log_parent.scope(log_buffers, dev.name(), |logs, dir| { - dir.read_binary_file(c"loginit", &logs.loginit.0); - dir.read_binary_file(c"logintr", &logs.logintr.0); - dir.read_binary_file(c"logrm", &logs.logrm.0); - dir.read_binary_file(c"logmnoc", &logs.logmnoc.0); - dir.read_binary_file(c"logroot", &logs.logroot.0); - dir.read_binary_file(c"logrmon", &logs.logrmon.0); + dir.read_binary_file(c"loginit", &logs.loginit); + dir.read_binary_file(c"logintr", &logs.logintr); + dir.read_binary_file(c"logrm", &logs.logrm); + dir.read_binary_file(c"logmnoc", &logs.logmnoc); + dir.read_binary_file(c"logroot", &logs.logroot); + dir.read_binary_file(c"logrmon", &logs.logrmon); }) }, })) diff --git a/drivers/gpu/nova-core/gsp/boot.rs b/drivers/gpu/nova-core/gsp/= boot.rs index fa879685bac5..a35a25cac9db 100644 --- a/drivers/gpu/nova-core/gsp/boot.rs +++ b/drivers/gpu/nova-core/gsp/boot.rs @@ -77,7 +77,7 @@ pub(crate) fn boot( let dev =3D pdev.as_ref(); let hal =3D super::hal::gsp_hal(chipset); =20 - let gsp_fw =3D KBox::pin_init(GspFirmware::new(dev, chipset), GFP_= KERNEL)?; + let gsp_fw =3D KBox::pin_init(GspFirmware::new(dev, chipset, &self= .gsp_tlv), GFP_KERNEL)?; =20 // GSP-RM reads the ucodes image through a radix3 page table, so t= he mapping has to // outlive initialization. From nobody Fri Sep 25 10:37:46 2026 Received: from CY7PR03CU001.outbound.protection.outlook.com (mail-westcentralusazon11010048.outbound.protection.outlook.com [40.93.198.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 8AAE83F7ABC for ; Mon, 14 Sep 2026 07:54:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.198.48 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372451; cv=fail; b=ZN8LBlO5a/GpAQA1xlfwY1zd8Lc6RgEFPRAheU8f7pllM1SRuyMF5NS68IHTAUfswYoagmj5QCVt7nT71643gf1j6Z5UJ5zfMRUf7Slz/fdk4Nk+UuumOIA1365stScyj3B1H28CffPR3VtHZvO7djKRczir2X/Q0uB+DJk4gGA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789372451; c=relaxed/simple; bh=Y2ttJKNvie+Yp+U/gQIf0jDc6/cYUnCGBW90cQ4iZDw=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UyyU9DS3Dx8fWsc6rv6XiSJCcMB6U7sh3lb1mqHkt92vu9T/6IBBmCQZoEgO2VwzLbixyjLs26HK3PkA/LPB7KQO7m5Hn9pnOBSB0MFfVGGitKCfW4Pp8b/H/tIXLU/WJ0xc/+RFYT6OcudtMZ1iCsrTP8U4H2p0DanTFBCMi3Y= 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=EMRoQVrg; arc=fail smtp.client-ip=40.93.198.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="EMRoQVrg" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=wC0mFtJmqQnou+yciOEOzwelG5aoC8VbSqLngGdg0Gt/faH/93yfmwHAY0fj4dUTKT4z5mk5j9xI07mMh5XtIC/pNE8DOCNn/HiIpUDnRsyLlTiGulGfBN5qgIT7ahJMGmmqVDWv/Jh9V9CxfGiROGhReuFKZ68STV8NZPBycZ1yggt3m26JXkiLNTYsaE1kViG3dE25gTsAnKUNAVBN3Yibe9jZWbisitHSLaUac/rmNC8KU5yW3oOyRJDkMrNnUZHzmlZPxkMSdS8th66BIIcwK4hIeAvHOe/AsrXK4Vk/s5VgaBkKxC/zNy87aM7kktgTUpkxS9u9tiyOmF0HgA== 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=pJ4Jh8xsaDBgQ7nuX/KUtmEOWQZISY3Al9lMEfSIE7M=; b=IPs22ambn3gxC6Vlhq20c3y6mmchnrAlACdfxioBu78DUJXllMLlJRG5X+QmbfuF5bfb+/la7CQCpj8Mf8RAfXYF/CxrlJYMD5/4ZqGlOc9CPrh0nx/LdvEXxWPbxYgiyLf5H5Rw19DephdKuXvi6MEceNAf5JEjaZAka6MKaVasdTIkfZQgalxUo+J2INvGm+O9a/tIGURjdntyaqLD1qiofFZn8NEjNeQ6nuuSU7JiTt6msel49jAlQPTnn0ky2b+PmkBVrbjXTfEF44QX9zObdym1YF0BjziYo6WxXlnNI82WPWDgaahtdb2vGSMpJvfq7WaE7DTz9GkVZW0JQg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 216.228.117.160) smtp.rcpttodomain=kernel.org smtp.mailfrom=nvidia.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=nvidia.com; dkim=none (message not signed); arc=none (0) 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=pJ4Jh8xsaDBgQ7nuX/KUtmEOWQZISY3Al9lMEfSIE7M=; b=EMRoQVrgnIbQdc2jhvC/zts9qhe7H5QK6RwGjDDDzH0426nfSztslVjt8BNV5sRIh7PaT9P1Y/42wn0qRq5MkLPU78NiuBEDsVli6Zy2RhlA/zU31ByKXUZKweeshE0upoZXa/5njDfGHnYIu1txpDd53sEa0J5bc4OmnclNIEVNS1PlxpJ9K9EfBhH++rwAQL2jKbCBvKOGgBujQiaZfULSiPYvI/hcxElsexWuH+7imHO3NtrIylpgm3U+PhBKw7VdqhYNMrVH3o08N0ZCNNDYi8Q8VAIKcjow7ORnj48p72iwGE+6nM/y8Rw6ccJh+eB8Cwi67q3s8wSyK+8iQA== Received: from DS7P221CA0030.NAMP221.PROD.OUTLOOK.COM (2603:10b6:8:25e::12) by SN7PR12MB7787.namprd12.prod.outlook.com (2603:10b6:806:347::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.406.12; Mon, 14 Sep 2026 07:54:01 +0000 Received: from DS2PEPF000061C6.namprd02.prod.outlook.com (2603:10b6:8:25e:cafe::4) by DS7P221CA0030.outlook.office365.com (2603:10b6:8:25e::12) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.21.406.12 via Frontend Transport; Mon, 14 Sep 2026 07:54:01 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 216.228.117.160) smtp.mailfrom=nvidia.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=nvidia.com; Received-SPF: Pass (protection.outlook.com: domain of nvidia.com designates 216.228.117.160 as permitted sender) receiver=protection.outlook.com; client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C Received: from mail.nvidia.com (216.228.117.160) by DS2PEPF000061C6.mail.protection.outlook.com (10.167.23.73) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.21.428.7 via Frontend Transport; Mon, 14 Sep 2026 07:54:01 +0000 Received: from rnnvmail205.nvidia.com (10.129.68.10) by mail.nvidia.com (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.49; Mon, 14 Sep 2026 00:53:47 -0700 Received: from rnnvmail204.nvidia.com (10.129.68.6) by rnnvmail205.nvidia.com (10.129.68.10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.46; Mon, 14 Sep 2026 00:53:46 -0700 Received: from inno-dell.home (10.127.8.11) by mail.nvidia.com (10.129.68.6) with Microsoft SMTP Server id 15.2.2562.46 via Frontend Transport; Mon, 14 Sep 2026 00:53:39 -0700 From: Zhi Wang To: , CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Zhi Wang Subject: [PATCH v2 32/32] gpu: nova-core: vgpu: export plugin log buffers via debugfs Date: Mon, 14 Sep 2026 10:49:07 +0300 Message-ID: <20260914074907.1399629-33-zhiw@nvidia.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260914074907.1399629-1-zhiw@nvidia.com> References: <20260914074907.1399629-1-zhiw@nvidia.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-NV-OnPremToCloud: ExternallySecured X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS2PEPF000061C6:EE_|SN7PR12MB7787:EE_ X-MS-Office365-Filtering-Correlation-Id: 102c7826-2167-481d-6a07-08df1235573a X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|376014|36860700016|23010399003|1800799024|82310400026|6133799003|3023799007|10067099003|56012099006|11063799006|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: pzaY1DHzfi56VC5mB/GyUhjL1kaTl4B+rCK6t1FIWiQTRk7J/+jSbasKHhgzGjI5aWQWCzdQ8BjUiLHaS4SoP478598f4Qm4YxSRetnYjE3NytYTknT6jb0G8HaFCPts4rfo05izN/I1Xj7HyyNzW6QOOghyDzE8zBN97nLbhfS8tdGA3ghPg99AQM5oD4IXISc4aehmjW5eY6nE9xGWIjbwSf4I0NhEHmaqoEmz0r8sIu+gQpl115Yw1dmV0DtEbmQnWzXRS2O+8cweIaVX/jLxIWCUbxHXQ1//ujwxkExXwItK9Rmojq3o2mB7PLVANL0iE1qqwUupBKVP5aXQMPAQ4FsAhNb2VYfR5wIfdMM0jsBShr/1aUoSTuIHQS3Ac7s5gFeLIrppHftgrgZm+0utye2JZ6QygKqJjHCbTsOrIvGFoE7e9suRcxJ0L/Cog8ziQz6CdZtbR4aIWHuXXYcGUPTA7Uvpa7DcCLTr7OYOaBIPVKWqR4ts7tPsAlGB3cLZHrp2UZTqTxgB6v4/etxq0Bj1ErDmIUwfXXmFsuIn+lbHSOskfBlWOS6U0Zczi8i6uCByQB0PWPHDo8PEBFZR66pzRv5cUfYMR4Lp5WHdO+LFGQIajokxURIRZ6IzGJNDhzThXR1PlKBobn4gc+LuURzJ0NlQBvsdnoke+53/if0HtjLMS7drKf5ExJb2kEoDqM8zXQQMB335t7HukA== X-Forefront-Antispam-Report: CIP:216.228.117.160;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:mail.nvidia.com;PTR:dc6edge1.nvidia.com;CAT:NONE;SFS:(13230040)(7416014)(376014)(36860700016)(23010399003)(1800799024)(82310400026)(6133799003)(3023799007)(10067099003)(56012099006)(11063799006)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: H+qJttyrrvID8/qSoyFVSZHxLzxMUmvUJ8iFDGC1RrB0Sjy+oVpN7ns41om9FR991eLtmuUEdgu6kTFkCdZNgIE2o4bsAEsS35ND3DSUsQxQkuHVDvXR7V/Z+LcmiRXL1dkUTIPcC4U70RV88vaCF5sJCs03cYmOZMllEfwZyir42yB4sqZHWrMTkSbqZGINyTOJOvutGN5pOF8hMqtBf3DvKh/Do2QGkeFdS34ptuMBRNMv81ZWlFy5UVvFlrath19TsoAd8Sh4mWeT3TFh0FVDaz7LT2wYysltHqSB2/TL8ucXxmBazDZCfSjCG90IJbF/gt9EvWAE7Fy8yh15YZz8W2OLts2pJtivPmIs8WgUvOCUHKV2fzItuDzGwBcnbg109QILdb3zbDvStuBYwDK+cFdzM6eFBEGnLEogg5IIx2/0pQ0P+ARfezMgtw6P X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Sep 2026 07:54:01.4267 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 102c7826-2167-481d-6a07-08df1235573a X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a;Ip=[216.228.117.160];Helo=[mail.nvidia.com] X-MS-Exchange-CrossTenant-AuthSource: DS2PEPF000061C6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR12MB7787 Content-Type: text/plain; charset="utf-8" Expose the three per-VM GSP plugin log buffers (init, vgpu, kernel) through debugfs so that nvlog_decoder can decode them at runtime. Each log file is backed by VRAM in the management heap and read via BAR1 MMIO. Prepend the GSP log header when a firmware build ID is available. Signed-off-by: Zhi Wang --- drivers/gpu/nova-core/gsp.rs | 4 +- drivers/gpu/nova-core/mm/bar_user.rs | 5 +- drivers/gpu/nova-core/vgpu.rs | 1 + drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs | 120 +++++++++++- drivers/gpu/nova-core/vgpu/instance.rs | 77 +++++++- drivers/gpu/nova-core/vgpu/log.rs | 171 ++++++++++++++++++ 6 files changed, 364 insertions(+), 14 deletions(-) create mode 100644 drivers/gpu/nova-core/vgpu/log.rs diff --git a/drivers/gpu/nova-core/gsp.rs b/drivers/gpu/nova-core/gsp.rs index 0bf4c8ee96ee..96ee879ce268 100644 --- a/drivers/gpu/nova-core/gsp.rs +++ b/drivers/gpu/nova-core/gsp.rs @@ -115,7 +115,7 @@ fn init(view: CoherentView<'_, Self>, start: DmaAddress= ) -> Result<()> { /// This header makes each dump self-describing so that decoding tools can /// identify the firmware build, GPU architecture, and metadata format wit= hout /// out-of-band information. -const LOG_BUFFER_HEADER_SIZE: usize =3D 0x48; +pub(crate) const LOG_BUFFER_HEADER_SIZE: usize =3D 0x48; =20 /// Build a log buffer header from GPU and firmware metadata. /// @@ -129,7 +129,7 @@ fn init(view: CoherentView<'_, Self>, start: DmaAddress= ) -> Result<()> { /// 0x20 buildId[32] /// 0x40 flags (u32) =3D 1 (packed metadata) /// 0x44 reserved (u32) =3D 0 -fn build_log_buffer_header( +pub(crate) fn build_log_buffer_header( chipset: Chipset, build_id: &BuildId, task_prefix: &str, diff --git a/drivers/gpu/nova-core/mm/bar_user.rs b/drivers/gpu/nova-core/m= m/bar_user.rs index b7b4bf14b56d..2e9482256b16 100644 --- a/drivers/gpu/nova-core/mm/bar_user.rs +++ b/drivers/gpu/nova-core/mm/bar_user.rs @@ -188,7 +188,6 @@ pub(crate) struct BarMapping<'map, 'gpu> { logical_size: usize, } =20 -#[expect(dead_code)] impl<'map, 'gpu> BarMapping<'map, 'gpu> { /// Maps the containing pages while restricting CPU access to the requ= ested byte range. pub(crate) fn new( @@ -231,6 +230,10 @@ pub(crate) fn new( }) } =20 + pub(crate) fn bar1(&self) -> &'gpu Bar1<'gpu> { + self.access.bar_user.bar1 + } + pub(crate) fn region(&self) -> &VramRegion { &self.region } diff --git a/drivers/gpu/nova-core/vgpu.rs b/drivers/gpu/nova-core/vgpu.rs index 407accc05139..123f5a20986e 100644 --- a/drivers/gpu/nova-core/vgpu.rs +++ b/drivers/gpu/nova-core/vgpu.rs @@ -28,6 +28,7 @@ mod gsp_plugin_rpc; mod hal; mod instance; +mod log; mod scrubber; mod vram; =20 diff --git a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs b/drivers/gpu/no= va-core/vgpu/gsp_plugin_comm.rs index e385ecff43fa..7aa9e9caaa49 100644 --- a/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs +++ b/drivers/gpu/nova-core/vgpu/gsp_plugin_comm.rs @@ -3,15 +3,21 @@ =20 //! GSP plugin communication buffer mappings and access. =20 -use kernel::prelude::*; +use kernel::{ + io::Io, + prelude::*, // +}; =20 -use crate::mm::{ - bar_user::{ - BarMapping, - BarUser, // +use crate::{ + driver::Bar1, + mm::{ + bar_user::{ + BarMapping, + BarUser, // + }, + vram::VramRegion, + GpuMm, // }, - vram::VramRegion, - GpuMm, // }; =20 use super::fw::{ @@ -50,6 +56,97 @@ fn take_region(region: &VramRegion, cursor: &mut u64, si= ze: u32) -> Result { + bar1: &'gpu Bar1<'gpu>, + gpu_va_addr: usize, + size: usize, +} + +impl<'gpu> MappedPluginLogBuffer<'gpu> { + fn new(map: &BarMapping<'_, 'gpu>, region: &VramRegion) -> Result { + let start =3D region + .address() + .checked_sub(map.region().address()) + .ok_or(EINVAL) + .and_then(|start| usize::try_from(start).map_err(|_| EOVERFLOW= ))?; + let size =3D usize::try_from(region.size()).map_err(|_| EOVERFLOW)= ?; + let end =3D start.checked_add(size).ok_or(EOVERFLOW)?; + if end > map.size() || !start.is_multiple_of(4) || !size.is_multip= le_of(4) { + return Err(EINVAL); + } + + let gpu_va_addr =3D usize::try_from(map.gpu_va_addr()?) + .map_err(|_| EOVERFLOW)? + .checked_add(start) + .ok_or(EOVERFLOW)?; + if !gpu_va_addr.is_multiple_of(4) { + return Err(EINVAL); + } + + let bar1 =3D map.bar1(); + if gpu_va_addr.checked_add(size).ok_or(EOVERFLOW)? > bar1.size() { + return Err(EINVAL); + } + + Ok(Self { + bar1, + gpu_va_addr, + size, + }) + } + + pub(super) const fn size(&self) -> usize { + self.size + } + + pub(super) fn read(&self, offset: usize, output: &mut [u8]) -> Result { + let end =3D offset.checked_add(output.len()).ok_or(EOVERFLOW)?; + if end > self.size { + return Err(EINVAL); + } + + let mut source =3D offset; + let mut copied =3D 0usize; + + while copied < output.len() { + let aligned_source =3D source & !3; + let within =3D source & 3; + let bar_offset =3D self + .gpu_va_addr + .checked_add(aligned_source) + .ok_or(EOVERFLOW)?; + let bytes =3D self.bar1.try_read32(bar_offset)?.to_le_bytes(); + let chunk =3D (4 - within).min(output.len() - copied); + + output[copied..copied + chunk].copy_from_slice(&bytes[within..= within + chunk]); + source =3D source.checked_add(chunk).ok_or(EOVERFLOW)?; + copied +=3D chunk; + } + + Ok(()) + } +} + +/// BAR1 views of all vGPU plugin log buffers. +pub(super) struct MappedPluginLogBuffers<'gpu> { + init: MappedPluginLogBuffer<'gpu>, + vgpu: MappedPluginLogBuffer<'gpu>, + kernel: MappedPluginLogBuffer<'gpu>, +} + +impl<'gpu> MappedPluginLogBuffers<'gpu> { + pub(super) fn into_parts( + self, + ) -> ( + MappedPluginLogBuffer<'gpu>, + MappedPluginLogBuffer<'gpu>, + MappedPluginLogBuffer<'gpu>, + ) { + (self.init, self.vgpu, self.kernel) + } +} + /// BAR1 mapping of the plugin communication region in its management heap. /// /// r000 layout, with byte offsets from the management heap (not to scale): @@ -216,6 +313,15 @@ pub(super) fn plugin_logs(&self) -> PluginLogRegions { } } =20 + /// Return BAR1 views that must stop being read before this mapping is= destroyed. + pub(super) fn mapped_plugin_logs(&self) -> Result> { + Ok(MappedPluginLogBuffers { + init: MappedPluginLogBuffer::new(&self.map, &self.init_log)?, + vgpu: MappedPluginLogBuffer::new(&self.map, &self.vgpu_log)?, + kernel: MappedPluginLogBuffer::new(&self.map, &self.kernel_log= )?, + }) + } + /// Clear a previous boot marker before starting the plugin. pub(super) fn clear_plugin_ready(&self) -> Result { let offset =3D self.io_offset( diff --git a/drivers/gpu/nova-core/vgpu/instance.rs b/drivers/gpu/nova-core= /vgpu/instance.rs index bb01d4088b5e..7f47c158d407 100644 --- a/drivers/gpu/nova-core/vgpu/instance.rs +++ b/drivers/gpu/nova-core/vgpu/instance.rs @@ -4,10 +4,12 @@ use core::num::NonZeroUsize; =20 use kernel::{ + debugfs, device, prelude::*, ptr::Alignment, - sizes::SizeConstants, // + sizes::SizeConstants, + str::CString, // time::{ delay::fsleep, Delta, @@ -23,7 +25,11 @@ =20 use crate::{ driver::Bar0, - gpu::ChannelIdReservation, + firmware::BuildId, + gpu::{ + ChannelIdReservation, + Chipset, // + }, mm::{ bar_user::BarUser, GpuMm, // @@ -31,8 +37,12 @@ }; =20 use super::{ - gsp_plugin_comm::CommBufferRegion, + gsp_plugin_comm::{ + CommBufferRegion, + MappedPluginLogBuffers, // + }, gsp_plugin_rpc::PluginRpc, + log::VgpuLogBuffers, scrubber::CeUtils, vram::{ VgpuVramLayout, @@ -143,6 +153,7 @@ pub(super) struct VgpuInstance<'gpu> { vm_pid: u32, chids: ChannelIdReservation<'gpu>, num_plugin_channels: u32, + debugfs_logs: Option>>>>, vram_slot: VgpuVramSlot, pub(super) plugin_rpc: PluginRpc<'gpu, 'gpu>, ceutils: Option, @@ -246,6 +257,39 @@ pub(super) const fn new(gfid: Gfid, dbdf: Dbdf, vgpu_t= ype: VgpuType, vm_pid: u32 } } =20 +fn create_debugfs_logs<'gpu>( + buffers: MappedPluginLogBuffers<'gpu>, + dbdf: Dbdf, + chipset: Chipset, + build_id: Option<&BuildId>, +) -> Result>>>> { + let logs =3D VgpuLogBuffers::new(buffers, chipset, build_id); + let raw_dbdf =3D dbdf.into_raw(); + let domain =3D raw_dbdf >> 16; + let bus =3D (raw_dbdf >> 8) & 0xff; + let device =3D (raw_dbdf >> 3) & 0x1f; + let function =3D raw_dbdf & 0x07; + let directory =3D CString::try_from_fmt(fmt!( + "{:04x}:{:02x}:{:02x}.{:x}-vgpu", + domain, + bus, + device, + function, + ))?; + + #[allow(static_mut_refs)] + // SAFETY: The root is initialized before driver registration and clea= red + // only after driver unregistration has drained all users. + let root =3D unsafe { crate::DEBUGFS_ROOT.as_ref() }.ok_or(ENODEV)?; + + KBox::pin_init( + root.scope(logs, &directory, |logs, directory| { + VgpuLogBuffers::register_debugfs(logs, directory); + }), + GFP_KERNEL, + ) +} + /// Registry of live vGPU instances. pub(super) struct VgpuInstances<'gpu> { instances: KVec>, @@ -287,10 +331,12 @@ fn release_vram_slot(&mut self, slot: VgpuVramSlot) -= > Result { =20 fn release_instance(&mut self, instance: VgpuInstance<'gpu>, mm: &mut = GpuMm<'_>) -> Result { let VgpuInstance { + debugfs_logs, plugin_rpc, vram_slot, .. } =3D instance; + drop(debugfs_logs); let result =3D plugin_rpc.destroy(mm); self.release_vram_slot(vram_slot)?; result @@ -369,6 +415,7 @@ pub(super) fn allocate_instance( vm_pid, chids, num_plugin_channels: 3, + debugfs_logs: None, vram_slot, plugin_rpc: PluginRpc::new(comm), ceutils: None, @@ -407,6 +454,7 @@ pub(super) fn allocate_instance( } =20 /// Boot and configure the GSP plugin for a registered instance. + #[expect(clippy::too_many_arguments)] pub(super) fn activate_instance( &mut self, dev: &device::Device, @@ -414,6 +462,8 @@ pub(super) fn activate_instance( bar0: Bar0<'_>, gfid: Gfid, fifo_engine_list: &FifoEngineList, + chipset: Chipset, + build_id: Option<&BuildId>, ) -> Result { let instance =3D self .instances @@ -428,7 +478,26 @@ pub(super) fn activate_instance( instance.plugin_rpc.init_rpc()?; negotiate_plugin_version(dev, bar0, gfid, &mut instance.plugin_rpc= )?; instance.configure_plugin(dev, bar0)?; - set_plugin_bme(dev, bar0, gfid, &mut instance.plugin_rpc, true) + set_plugin_bme(dev, bar0, gfid, &mut instance.plugin_rpc, true)?; + + if instance.debugfs_logs.is_none() { + match instance + .plugin_rpc + .comm() + .mapped_plugin_logs() + .and_then(|buffers| create_debugfs_logs(buffers, instance.= dbdf, chipset, build_id)) + { + Ok(logs) =3D> instance.debugfs_logs =3D Some(logs), + Err(error) =3D> dev_warn!( + dev, + "debugfs logs unavailable for gfid=3D{}: {:?}\n", + gfid.0, + error, + ), + } + } + + Ok(()) } =20 /// Stop the plugin and release the instance's firmware and host resou= rces. diff --git a/drivers/gpu/nova-core/vgpu/log.rs b/drivers/gpu/nova-core/vgpu= /log.rs new file mode 100644 index 000000000000..6f58f8ae9bf0 --- /dev/null +++ b/drivers/gpu/nova-core/vgpu/log.rs @@ -0,0 +1,171 @@ +// SPDX-License-Identifier: GPL-2.0 +// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIA= TES. All rights reserved. + +//! GSP plugin logs exposed through debugfs. +//! +//! With debugfs mounted at `/sys/kernel/debug`, the directory uses the VF= 's +//! PCI domain:bus:device.function address: +//! +//! ```text +//! /sys/kernel/debug/nova-core/-vgpu/ +//! |-- init_log +//! |-- vgpu_log +//! `-- kernel_log +//! ``` + +use kernel::{ + debugfs, + fs::file, + prelude::*, + uaccess::UserSliceWriter, // +}; + +use crate::{ + firmware::BuildId, + gpu::Chipset, + gsp::{ + build_log_buffer_header, + LOG_BUFFER_HEADER_SIZE, // + }, + vgpu::gsp_plugin_comm::{ + MappedPluginLogBuffer, + MappedPluginLogBuffers, // + }, +}; + +const LOG_READ_CHUNK_SIZE: usize =3D 4096; + +/// A vGPU plugin log buffer backed by VRAM, read via BAR1 MMIO. +/// +/// An optional header lets `nvlog_decoder` identify the GPU architecture = and firmware build. +struct VgpuLogBuffer<'gpu> { + buffer: MappedPluginLogBuffer<'gpu>, + header: [u8; LOG_BUFFER_HEADER_SIZE], + header_len: usize, +} + +impl<'gpu> VgpuLogBuffer<'gpu> { + fn new( + buffer: MappedPluginLogBuffer<'gpu>, + chipset: Chipset, + build_id: Option<&BuildId>, + task_prefix: &str, + ) -> Self { + let (header, header_len) =3D match build_id { + Some(bid) =3D> ( + build_log_buffer_header(chipset, bid, task_prefix), + LOG_BUFFER_HEADER_SIZE, + ), + None =3D> ([0u8; LOG_BUFFER_HEADER_SIZE], 0), + }; + + Self { + buffer, + header, + header_len, + } + } +} + +impl debugfs::BinaryWriter for VgpuLogBuffer<'_> { + fn write_to_slice( + &self, + writer: &mut UserSliceWriter, + offset: &mut file::Offset, + ) -> Result { + if offset.is_negative() { + return Err(EINVAL); + } + + let offset_val: usize =3D (*offset).try_into().map_err(|_| EINVAL)= ?; + let total_len =3D self + .header_len + .checked_add(self.buffer.size()) + .ok_or(EOVERFLOW)?; + + if offset_val >=3D total_len { + return Ok(0); + } + + let count =3D (total_len - offset_val).min(writer.len()); + if count =3D=3D 0 { + return Ok(0); + } + + // Keep the staging buffer on the heap to avoid a page-sized kerne= l stack object. + let staging_size =3D count.min(LOG_READ_CHUNK_SIZE); + let mut staging =3D KVec::new(); + staging.resize(staging_size, 0, GFP_KERNEL)?; + + let mut written =3D 0usize; + let result: Result =3D (|| { + while written < count { + let chunk_len =3D (count - written).min(staging.len()); + let chunk =3D &mut staging[..chunk_len]; + let chunk_offset =3D offset_val.checked_add(written).ok_or= (EOVERFLOW)?; + let mut filled =3D 0usize; + + if chunk_offset < self.header_len { + let header_len =3D (self.header_len - chunk_offset).mi= n(chunk_len); + chunk[..header_len] + .copy_from_slice(&self.header[chunk_offset..chunk_= offset + header_len]); + filled =3D header_len; + } + + if filled < chunk_len { + let log_offset =3D chunk_offset + .checked_add(filled) + .ok_or(EOVERFLOW)? + .checked_sub(self.header_len) + .ok_or(EINVAL)?; + + self.buffer.read(log_offset, &mut chunk[filled..])?; + } + + writer.write_slice(chunk)?; + written =3D written.checked_add(chunk_len).ok_or(EOVERFLOW= )?; + } + Ok(()) + })(); + if written =3D=3D 0 { + result?; + } + + *offset =3D (*offset) + .checked_add(i64::try_from(written).map_err(|_| EOVERFLOW)?) + .ok_or(EOVERFLOW)?; + Ok(written) + } +} + +/// The three plugin log streams for one vGPU instance. +pub(super) struct VgpuLogBuffers<'gpu> { + init_log: VgpuLogBuffer<'gpu>, + vgpu_log: VgpuLogBuffer<'gpu>, + kernel_log: VgpuLogBuffer<'gpu>, +} + +impl<'gpu> VgpuLogBuffers<'gpu> { + pub(super) fn new( + buffers: MappedPluginLogBuffers<'gpu>, + chipset: Chipset, + build_id: Option<&BuildId>, + ) -> Self { + let (init, vgpu, kernel) =3D buffers.into_parts(); + + Self { + init_log: VgpuLogBuffer::new(init, chipset, build_id, "INIT"), + vgpu_log: VgpuLogBuffer::new(vgpu, chipset, build_id, "VGPU"), + kernel_log: VgpuLogBuffer::new(kernel, chipset, build_id, "KER= N"), + } + } + + pub(super) fn register_debugfs<'data, 'dir>( + logs: &'data Self, + dir: &'dir debugfs::ScopedDir<'data, 'dir>, + ) { + dir.read_binary_file(c"init_log", &logs.init_log); + dir.read_binary_file(c"vgpu_log", &logs.vgpu_log); + dir.read_binary_file(c"kernel_log", &logs.kernel_log); + } +}