From d673aa6d344efd46d788e518ccd8415b5e07a6f4 Mon Sep 17 00:00:00 2001 From: Hamed Akhondzadeh Date: Thu, 25 Jun 2026 22:56:01 -0700 Subject: [PATCH 1/6] feat: Adding VR hardware type to BMC explorer --- crates/bmc-explorer/src/hw/mod.rs | 5 +++++ crates/bmc-explorer/src/hw/vr.rs | 27 +++++++++++++++++++++++++++ crates/bmc-explorer/src/lib.rs | 22 ++++++++++++++++++---- 3 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 crates/bmc-explorer/src/hw/vr.rs diff --git a/crates/bmc-explorer/src/hw/mod.rs b/crates/bmc-explorer/src/hw/mod.rs index d9019b52a1..be46c172e3 100644 --- a/crates/bmc-explorer/src/hw/mod.rs +++ b/crates/bmc-explorer/src/hw/mod.rs @@ -28,6 +28,7 @@ pub mod lenovo_ami; pub mod lenovo_gb300; pub mod supermicro; pub mod viking; +pub mod vr; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum HwType { @@ -45,6 +46,7 @@ pub enum HwType { Viking, LiteonPowerShelf, NvSwitch, + Vr, } impl HwType { @@ -66,6 +68,7 @@ impl HwType { Self::NvSwitch => Some(bmc_vendor::BMCVendor::Nvidia), Self::Supermicro => Some(bmc_vendor::BMCVendor::Supermicro), Self::Viking => Some(bmc_vendor::BMCVendor::Nvidia), + Self::Vr => Some(bmc_vendor::BMCVendor::Nvidia), } } @@ -90,6 +93,8 @@ impl HwType { Self::NvSwitch => None, Self::Supermicro => None, Self::Viking => Some(BiosAttr::new_str("NvidiaInfiniteboot", "Enable")), + // Same EmbeddedUefiShell polarity as GB200 / libredfish NvidiaGBx00. + Self::Vr => Some(BiosAttr::new_str("EmbeddedUefiShell", "Disabled")), } } } diff --git a/crates/bmc-explorer/src/hw/vr.rs b/crates/bmc-explorer/src/hw/vr.rs new file mode 100644 index 0000000000..75ff53eb36 --- /dev/null +++ b/crates/bmc-explorer/src/hw/vr.rs @@ -0,0 +1,27 @@ +/* + * SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +use crate::hw::BiosAttr; + +// Vera Rubin (VR) compute-tray host BMC: Systems/System_0, ServiceRoot Product "VR NVL72". +// Shares TPM / EmbeddedUefiShell with GB200; uses GpuExposeAsPcie instead of GB200's +// Socket{0,1}Pcie6DisableOptionROM knobs. +pub const EXPECTED_BIOS_ATTRS: [BiosAttr; 3] = [ + BiosAttr::new_str("TPM", "Enabled"), + BiosAttr::new_str("EmbeddedUefiShell", "Disabled"), + BiosAttr::new_bool("GpuExposeAsPcie", true), +]; diff --git a/crates/bmc-explorer/src/lib.rs b/crates/bmc-explorer/src/lib.rs index 40c4ad1a4a..55bbd0865a 100644 --- a/crates/bmc-explorer/src/lib.rs +++ b/crates/bmc-explorer/src/lib.rs @@ -195,6 +195,11 @@ pub async fn nv_generate_exploration_report( let chassis_id = chassis.chassis.id().into_inner(); chassis_id.starts_with("HGX_GPU_") } + + Some(hw::HwType::Vr) => { + let chassis_id = chassis.chassis.id().into_inner(); + chassis_id.starts_with("HGX_GPU_") + } // No meaningful PCIeDevices. Some( hw::HwType::Bluefield @@ -310,6 +315,11 @@ pub(crate) fn hw_type( "Supermicro" => Some(hw::HwType::Supermicro), "HPE" => Some(hw::HwType::Hpe), "Nvidia" if system.id().into_inner() == "Bluefield" => Some(hw::HwType::Bluefield), + "NVIDIA" + if root.product() == Some(Product::new("VR NVL72")) => + { + Some(hw::HwType::Vr) + } "WIWYNN" | "NVIDIA" if root.product() == Some(Product::new("GB200 NVL")) || root.product() == Some(Product::new("GB BMC")) => @@ -867,7 +877,7 @@ fn machine_setup_status( } } - hw::HwType::Gb200 => { + hw::HwType::Gb200 | hw::HwType::Vr => { if explored_system .secure_boot_status() .is_ok_and(|s| s.is_enabled) @@ -878,16 +888,20 @@ fn machine_setup_status( actual: "true".to_string(), }) } - // BIOS configuration: + let expected_bios_attrs: &[hw::BiosAttr] = match hw_type { + hw::HwType::Gb200 => &hw::gb200::EXPECTED_BIOS_ATTRS, + hw::HwType::Vr => &hw::vr::EXPECTED_BIOS_ATTRS, + _ => unreachable!(), + }; diffs.extend( - hw::gb200::EXPECTED_BIOS_ATTRS + expected_bios_attrs .iter() .flat_map(|expected| explored_system.verify_bios_attr(expected)), ); // Boot order if let Some(mac) = boot_interface_mac { // Looking for UEFI Device path: - // VenHw(REDACTED)/MemoryMapped(REDACTED)/PciRoot(0x6)/Pci(0x0,0x0)/Pci(0x0,0x0)/Pci(0x0,0x0)/Pci(0x0,0x0)/MAC(020304050607,0x1)/IPv4(0.0.0.0)/Uri() + // VenHw(...)/.../MAC(020304050607,0x1)/IPv4(0.0.0.0)/Uri() let actual = explored_system.boot_order_first_option(); let mac_str = format!("/MAC({},", mac.to_string().replace(":", "")); let expected = explored_system.boot_options.iter().find(|option| { From 12fa02c6bc0f8e8657bf534257ee4e921cde6caf Mon Sep 17 00:00:00 2001 From: Hamed Akhondzadeh Date: Fri, 26 Jun 2026 11:09:53 -0700 Subject: [PATCH 2/6] feat: rename vr to VeraRubin --- crates/bmc-explorer/src/hw/mod.rs | 8 ++++---- crates/bmc-explorer/src/hw/{vr.rs => vera_rubin.rs} | 2 +- crates/bmc-explorer/src/lib.rs | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) rename crates/bmc-explorer/src/hw/{vr.rs => vera_rubin.rs} (91%) diff --git a/crates/bmc-explorer/src/hw/mod.rs b/crates/bmc-explorer/src/hw/mod.rs index be46c172e3..9b38a5a7a1 100644 --- a/crates/bmc-explorer/src/hw/mod.rs +++ b/crates/bmc-explorer/src/hw/mod.rs @@ -28,7 +28,7 @@ pub mod lenovo_ami; pub mod lenovo_gb300; pub mod supermicro; pub mod viking; -pub mod vr; +pub mod vera_rubin; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum HwType { @@ -46,7 +46,7 @@ pub enum HwType { Viking, LiteonPowerShelf, NvSwitch, - Vr, + VeraRubin, } impl HwType { @@ -68,7 +68,7 @@ impl HwType { Self::NvSwitch => Some(bmc_vendor::BMCVendor::Nvidia), Self::Supermicro => Some(bmc_vendor::BMCVendor::Supermicro), Self::Viking => Some(bmc_vendor::BMCVendor::Nvidia), - Self::Vr => Some(bmc_vendor::BMCVendor::Nvidia), + Self::VeraRubin => Some(bmc_vendor::BMCVendor::Nvidia), } } @@ -94,7 +94,7 @@ impl HwType { Self::Supermicro => None, Self::Viking => Some(BiosAttr::new_str("NvidiaInfiniteboot", "Enable")), // Same EmbeddedUefiShell polarity as GB200 / libredfish NvidiaGBx00. - Self::Vr => Some(BiosAttr::new_str("EmbeddedUefiShell", "Disabled")), + Self::VeraRubin => Some(BiosAttr::new_str("EmbeddedUefiShell", "Disabled")), } } } diff --git a/crates/bmc-explorer/src/hw/vr.rs b/crates/bmc-explorer/src/hw/vera_rubin.rs similarity index 91% rename from crates/bmc-explorer/src/hw/vr.rs rename to crates/bmc-explorer/src/hw/vera_rubin.rs index 75ff53eb36..1843f7ac44 100644 --- a/crates/bmc-explorer/src/hw/vr.rs +++ b/crates/bmc-explorer/src/hw/vera_rubin.rs @@ -17,7 +17,7 @@ use crate::hw::BiosAttr; -// Vera Rubin (VR) compute-tray host BMC: Systems/System_0, ServiceRoot Product "VR NVL72". +// Vera Rubin compute-tray host BMC: Systems/System_0, ServiceRoot Product "VR NVL72". // Shares TPM / EmbeddedUefiShell with GB200; uses GpuExposeAsPcie instead of GB200's // Socket{0,1}Pcie6DisableOptionROM knobs. pub const EXPECTED_BIOS_ATTRS: [BiosAttr; 3] = [ diff --git a/crates/bmc-explorer/src/lib.rs b/crates/bmc-explorer/src/lib.rs index 55bbd0865a..6ce0fa6ffd 100644 --- a/crates/bmc-explorer/src/lib.rs +++ b/crates/bmc-explorer/src/lib.rs @@ -196,7 +196,7 @@ pub async fn nv_generate_exploration_report( chassis_id.starts_with("HGX_GPU_") } - Some(hw::HwType::Vr) => { + Some(hw::HwType::VeraRubin) => { let chassis_id = chassis.chassis.id().into_inner(); chassis_id.starts_with("HGX_GPU_") } @@ -318,7 +318,7 @@ pub(crate) fn hw_type( "NVIDIA" if root.product() == Some(Product::new("VR NVL72")) => { - Some(hw::HwType::Vr) + Some(hw::HwType::VeraRubin) } "WIWYNN" | "NVIDIA" if root.product() == Some(Product::new("GB200 NVL")) @@ -877,7 +877,7 @@ fn machine_setup_status( } } - hw::HwType::Gb200 | hw::HwType::Vr => { + hw::HwType::Gb200 | hw::HwType::VeraRubin => { if explored_system .secure_boot_status() .is_ok_and(|s| s.is_enabled) @@ -890,7 +890,7 @@ fn machine_setup_status( } let expected_bios_attrs: &[hw::BiosAttr] = match hw_type { hw::HwType::Gb200 => &hw::gb200::EXPECTED_BIOS_ATTRS, - hw::HwType::Vr => &hw::vr::EXPECTED_BIOS_ATTRS, + hw::HwType::VeraRubin => &hw::vera_rubin::EXPECTED_BIOS_ATTRS, _ => unreachable!(), }; diffs.extend( From d57dc52deb56a68003f4e942e0b457a02be9b1ea Mon Sep 17 00:00:00 2001 From: Hamed Akhondzadeh Date: Sun, 28 Jun 2026 19:19:20 -0700 Subject: [PATCH 3/6] feat: address review feedback --- crates/bmc-explorer/src/hw/mod.rs | 21 ++++++++++++++++++++ crates/bmc-explorer/src/lib.rs | 32 +++++++++++++------------------ 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/crates/bmc-explorer/src/hw/mod.rs b/crates/bmc-explorer/src/hw/mod.rs index 9b38a5a7a1..aa1b015e6a 100644 --- a/crates/bmc-explorer/src/hw/mod.rs +++ b/crates/bmc-explorer/src/hw/mod.rs @@ -97,6 +97,27 @@ impl HwType { Self::VeraRubin => Some(BiosAttr::new_str("EmbeddedUefiShell", "Disabled")), } } + + /// BIOS attributes verified in machine setup for this platform. + pub const fn expected_bios_attrs(self) -> Option<&'static [BiosAttr<'static>]> { + match self { + Self::Gb200 => Some(&gb200::EXPECTED_BIOS_ATTRS), + Self::VeraRubin => Some(&vera_rubin::EXPECTED_BIOS_ATTRS), + Self::Ami + | Self::Bluefield + | Self::Dell + | Self::DgxGb300 + | Self::Hpe + | Self::Lenovo + | Self::LenovoAmi + | Self::LenovoGb300 + | Self::SupermicroGb300 + | Self::Supermicro + | Self::Viking + | Self::LiteonPowerShelf + | Self::NvSwitch => None, + } + } } #[derive(Clone, Copy)] diff --git a/crates/bmc-explorer/src/lib.rs b/crates/bmc-explorer/src/lib.rs index 6ce0fa6ffd..d29eaf7a3d 100644 --- a/crates/bmc-explorer/src/lib.rs +++ b/crates/bmc-explorer/src/lib.rs @@ -191,15 +191,12 @@ pub async fn nv_generate_exploration_report( ) => chassis.chassis.id().into_inner() == explored_system.system.id().into_inner(), // Provides only one Chassis. Some(hw::HwType::LenovoAmi) => true, - Some(hw::HwType::LenovoGb300 | hw::HwType::DgxGb300 | hw::HwType::SupermicroGb300) => { - let chassis_id = chassis.chassis.id().into_inner(); - chassis_id.starts_with("HGX_GPU_") - } - - Some(hw::HwType::VeraRubin) => { - let chassis_id = chassis.chassis.id().into_inner(); - chassis_id.starts_with("HGX_GPU_") - } + Some( + hw::HwType::LenovoGb300 + | hw::HwType::DgxGb300 + | hw::HwType::SupermicroGb300 + | hw::HwType::VeraRubin, + ) => chassis.chassis.id().into_inner().starts_with("HGX_GPU_"), // No meaningful PCIeDevices. Some( hw::HwType::Bluefield @@ -888,16 +885,13 @@ fn machine_setup_status( actual: "true".to_string(), }) } - let expected_bios_attrs: &[hw::BiosAttr] = match hw_type { - hw::HwType::Gb200 => &hw::gb200::EXPECTED_BIOS_ATTRS, - hw::HwType::VeraRubin => &hw::vera_rubin::EXPECTED_BIOS_ATTRS, - _ => unreachable!(), - }; - diffs.extend( - expected_bios_attrs - .iter() - .flat_map(|expected| explored_system.verify_bios_attr(expected)), - ); + if let Some(platform_bios_attrs) = hw_type.expected_bios_attrs() { + diffs.extend( + platform_bios_attrs + .iter() + .flat_map(|attr| explored_system.verify_bios_attr(attr)), + ); + } // Boot order if let Some(mac) = boot_interface_mac { // Looking for UEFI Device path: From 38f6ccfa5258ceaaea9d90df37c66fa43c8f1540 Mon Sep 17 00:00:00 2001 From: Hamed Akhondzadeh Date: Mon, 29 Jun 2026 09:41:39 -0700 Subject: [PATCH 4/6] feat: format lint --- crates/bmc-explorer/src/hw/mod.rs | 2 +- crates/bmc-explorer/src/lib.rs | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/crates/bmc-explorer/src/hw/mod.rs b/crates/bmc-explorer/src/hw/mod.rs index aa1b015e6a..de82653536 100644 --- a/crates/bmc-explorer/src/hw/mod.rs +++ b/crates/bmc-explorer/src/hw/mod.rs @@ -27,8 +27,8 @@ pub mod lenovo; pub mod lenovo_ami; pub mod lenovo_gb300; pub mod supermicro; -pub mod viking; pub mod vera_rubin; +pub mod viking; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum HwType { diff --git a/crates/bmc-explorer/src/lib.rs b/crates/bmc-explorer/src/lib.rs index d29eaf7a3d..0830f2e37a 100644 --- a/crates/bmc-explorer/src/lib.rs +++ b/crates/bmc-explorer/src/lib.rs @@ -312,9 +312,7 @@ pub(crate) fn hw_type( "Supermicro" => Some(hw::HwType::Supermicro), "HPE" => Some(hw::HwType::Hpe), "Nvidia" if system.id().into_inner() == "Bluefield" => Some(hw::HwType::Bluefield), - "NVIDIA" - if root.product() == Some(Product::new("VR NVL72")) => - { + "NVIDIA" if root.product() == Some(Product::new("VR NVL72")) => { Some(hw::HwType::VeraRubin) } "WIWYNN" | "NVIDIA" From 88f2627b1a5ee4c59d5c07a63bd4f605471980cb Mon Sep 17 00:00:00 2001 From: Hamed Akhondzadeh Date: Mon, 29 Jun 2026 20:14:33 -0700 Subject: [PATCH 5/6] feat: separate GB200 and VR arms --- crates/bmc-explorer/src/hw/mod.rs | 21 -------------- crates/bmc-explorer/src/lib.rs | 47 +++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/crates/bmc-explorer/src/hw/mod.rs b/crates/bmc-explorer/src/hw/mod.rs index de82653536..a02d516a7f 100644 --- a/crates/bmc-explorer/src/hw/mod.rs +++ b/crates/bmc-explorer/src/hw/mod.rs @@ -97,27 +97,6 @@ impl HwType { Self::VeraRubin => Some(BiosAttr::new_str("EmbeddedUefiShell", "Disabled")), } } - - /// BIOS attributes verified in machine setup for this platform. - pub const fn expected_bios_attrs(self) -> Option<&'static [BiosAttr<'static>]> { - match self { - Self::Gb200 => Some(&gb200::EXPECTED_BIOS_ATTRS), - Self::VeraRubin => Some(&vera_rubin::EXPECTED_BIOS_ATTRS), - Self::Ami - | Self::Bluefield - | Self::Dell - | Self::DgxGb300 - | Self::Hpe - | Self::Lenovo - | Self::LenovoAmi - | Self::LenovoGb300 - | Self::SupermicroGb300 - | Self::Supermicro - | Self::Viking - | Self::LiteonPowerShelf - | Self::NvSwitch => None, - } - } } #[derive(Clone, Copy)] diff --git a/crates/bmc-explorer/src/lib.rs b/crates/bmc-explorer/src/lib.rs index 0830f2e37a..50b7fa4416 100644 --- a/crates/bmc-explorer/src/lib.rs +++ b/crates/bmc-explorer/src/lib.rs @@ -872,7 +872,7 @@ fn machine_setup_status( } } - hw::HwType::Gb200 | hw::HwType::VeraRubin => { + hw::HwType::Gb200 => { if explored_system .secure_boot_status() .is_ok_and(|s| s.is_enabled) @@ -883,14 +883,45 @@ fn machine_setup_status( actual: "true".to_string(), }) } - if let Some(platform_bios_attrs) = hw_type.expected_bios_attrs() { - diffs.extend( - platform_bios_attrs - .iter() - .flat_map(|attr| explored_system.verify_bios_attr(attr)), - ); + diffs.extend( + hw::gb200::EXPECTED_BIOS_ATTRS + .iter() + .flat_map(|expected| explored_system.verify_bios_attr(expected)), + ); + if let Some(mac) = boot_interface_mac { + // Looking for UEFI Device path: + // VenHw(...)/.../MAC(020304050607,0x1)/IPv4(0.0.0.0)/Uri() + let actual = explored_system.boot_order_first_option(); + let mac_str = format!("/MAC({},", mac.to_string().replace(":", "")); + let expected = explored_system.boot_options.iter().find(|option| { + option.uefi_device_path().is_some_and(|path| { + path.inner().contains(&mac_str) + && path.inner().contains("/IPv4(") + && path.inner().ends_with("/Uri()") + }) + }); + if let Some(diff) = compare_boot_options(expected, actual) { + diffs.push(diff) + } } - // Boot order + } + + hw::HwType::VeraRubin => { + if explored_system + .secure_boot_status() + .is_ok_and(|s| s.is_enabled) + { + diffs.push(MachineSetupDiff { + key: "SecureBoot".to_string(), + expected: "false".to_string(), + actual: "true".to_string(), + }) + } + diffs.extend( + hw::vera_rubin::EXPECTED_BIOS_ATTRS + .iter() + .flat_map(|expected| explored_system.verify_bios_attr(expected)), + ); if let Some(mac) = boot_interface_mac { // Looking for UEFI Device path: // VenHw(...)/.../MAC(020304050607,0x1)/IPv4(0.0.0.0)/Uri() From 82851a7db5cf9a8b69c79133ed73da57d7d5b0ff Mon Sep 17 00:00:00 2001 From: Hamed Akhondzadeh Date: Mon, 29 Jun 2026 20:19:46 -0700 Subject: [PATCH 6/6] feat: separate GB200 and VR arms --- crates/bmc-explorer/src/lib.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/bmc-explorer/src/lib.rs b/crates/bmc-explorer/src/lib.rs index 50b7fa4416..eead776966 100644 --- a/crates/bmc-explorer/src/lib.rs +++ b/crates/bmc-explorer/src/lib.rs @@ -883,14 +883,16 @@ fn machine_setup_status( actual: "true".to_string(), }) } + // BIOS configuration: diffs.extend( hw::gb200::EXPECTED_BIOS_ATTRS .iter() .flat_map(|expected| explored_system.verify_bios_attr(expected)), ); + // Boot order if let Some(mac) = boot_interface_mac { // Looking for UEFI Device path: - // VenHw(...)/.../MAC(020304050607,0x1)/IPv4(0.0.0.0)/Uri() + // VenHw(REDACTED)/MemoryMapped(REDACTED)/PciRoot(0x6)/Pci(0x0,0x0)/Pci(0x0,0x0)/Pci(0x0,0x0)/Pci(0x0,0x0)/MAC(020304050607,0x1)/IPv4(0.0.0.0)/Uri() let actual = explored_system.boot_order_first_option(); let mac_str = format!("/MAC({},", mac.to_string().replace(":", "")); let expected = explored_system.boot_options.iter().find(|option| {