From 80da7b1da998396cf9263a3b007dbe0ae2233e98 Mon Sep 17 00:00:00 2001 From: Krish Dandiwala Date: Fri, 12 Jun 2026 16:25:04 +0000 Subject: [PATCH 1/2] feat: enabling routing for Supermicro GB300s Signed-off-by: Krish Dandiwala --- src/model/service_root.rs | 28 +++++++++++++++++++++++++++- src/nvidia_gbx00.rs | 17 +++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/model/service_root.rs b/src/model/service_root.rs index 814772a46..7270acb18 100644 --- a/src/model/service_root.rs +++ b/src/model/service_root.rs @@ -111,7 +111,10 @@ impl ServiceRoot { _ => RedfishVendor::NvidiaDpu, }, "wiwynn" => RedfishVendor::NvidiaGBx00, - "supermicro" => RedfishVendor::Supermicro, + "supermicro" => match self.product.as_deref() { + Some("GB NVL") => RedfishVendor::NvidiaGBx00, + _ => RedfishVendor::Supermicro, + }, "lite-on technology corp." => RedfishVendor::LiteOnPowerShelf, "delta" => RedfishVendor::DeltaPowerShelf, _ => RedfishVendor::Unknown, @@ -138,6 +141,29 @@ mod test { assert_eq!(result.vendor().unwrap(), RedfishVendor::Supermicro); } + #[test] + fn test_supermicro_gb300_service_root() { + // Supermicro GB300 NVL exposes an OpenBMC/NVIDIA GB tree, so it must route + // to the shared GB implementation rather than the AMI Supermicro path. + let result = ServiceRoot { + vendor: Some("Supermicro".to_string()), + product: Some("GB NVL".to_string()), + ..Default::default() + }; + assert_eq!(result.vendor().unwrap(), RedfishVendor::NvidiaGBx00); + } + + #[test] + fn test_supermicro_non_gb_service_root() { + // A classic Supermicro (no GB NVL product) still uses the Supermicro path. + let result = ServiceRoot { + vendor: Some("Supermicro".to_string()), + product: Some("SYS-821GE-TNHR".to_string()), + ..Default::default() + }; + assert_eq!(result.vendor().unwrap(), RedfishVendor::Supermicro); + } + #[test] fn test_nvidia_gb_bmc_service_root() { let result = ServiceRoot { diff --git a/src/nvidia_gbx00.rs b/src/nvidia_gbx00.rs index 0d02aca2b..a8b617df6 100644 --- a/src/nvidia_gbx00.rs +++ b/src/nvidia_gbx00.rs @@ -1340,6 +1340,23 @@ impl Redfish for Bmc { } impl Bmc { + /// Returns true if this is a GB300 platform. + /// + /// The host system model (e.g."GB NVL") can be too vague, so detect via the HGX + /// baseboard model ("GB300 ..."). + async fn is_gb300(&self) -> Result { + let systems: Vec = self + .get_collection(ODataId { + odata_id: "/redfish/v1/Systems".to_string(), + }) + .await + .and_then(|c| c.try_get::())? + .members; + Ok(systems + .iter() + .any(|s| s.model.as_deref().unwrap_or_default().contains("GB300"))) + } + /// Check BIOS and BMC attributes and return differences async fn diff_bios_bmc_attr(&self) -> Result, RedfishError> { let mut diffs = vec![]; From 92fc78668374bfbadfef7b14da84f3c7a6852c98 Mon Sep 17 00:00:00 2001 From: Krish Dandiwala Date: Fri, 12 Jun 2026 16:38:51 +0000 Subject: [PATCH 2/2] chore: allow dead code Signed-off-by: Krish Dandiwala --- src/nvidia_gbx00.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/nvidia_gbx00.rs b/src/nvidia_gbx00.rs index a8b617df6..9959c7d14 100644 --- a/src/nvidia_gbx00.rs +++ b/src/nvidia_gbx00.rs @@ -1344,6 +1344,7 @@ impl Bmc { /// /// The host system model (e.g."GB NVL") can be too vague, so detect via the HGX /// baseboard model ("GB300 ..."). + #[allow(dead_code)] async fn is_gb300(&self) -> Result { let systems: Vec = self .get_collection(ODataId {