From b0741be11656e5242e0889087c672052e81ad9ac Mon Sep 17 00:00:00 2001 From: ARC Date: Sat, 4 Jul 2026 21:29:02 +0200 Subject: [PATCH] gsp: don't advertise RTD3 GC6/GC8/GCOFF on external (eGPU) boards _kgspInitGpuProperties() sets PDB_PROP_GPU_RTD3_GC6/GC8/GCOFF_SUPPORTED directly from the GSP static config silicon capability, with no check for external (Thunderbolt/OCuLink) GPUs. GC6/GC8/GCOFF are host-platform- coordinated deep power-down states that require the host to power-gate the GPU's PCIe slot. An external GPU in an enclosure with its own PSU cannot be host-power-gated, so after the RTD3 idle timeout the GPU attempts a power-down it can never complete: the GSP firmware faults (rpcSendMessage failed / GPU_IN_FULLCHIP_RESET) and the GPU falls off the bus. Gate the three properties on !PDB_PROP_GPU_IS_EXTERNAL_GPU (already set by RmCheckForExternalGpu before this runs). Orthogonal to dynamic clock scaling, so external GPUs keep full dynamic idle clocking while no longer attempting the impossible deep power-down. Verified on an RTX 5090 (GB202) over Thunderbolt: eliminates the idle GSP crash while preserving dynamic P-state idle (~38 W), versus a ~85 W clock-lock workaround. --- src/nvidia/src/kernel/gpu/gsp/kernel_gsp.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/nvidia/src/kernel/gpu/gsp/kernel_gsp.c b/src/nvidia/src/kernel/gpu/gsp/kernel_gsp.c index 4da1151c7..fdf9f9eeb 100644 --- a/src/nvidia/src/kernel/gpu/gsp/kernel_gsp.c +++ b/src/nvidia/src/kernel/gpu/gsp/kernel_gsp.c @@ -6613,9 +6613,9 @@ _kgspInitGpuProperties(OBJGPU *pGpu) GspStaticConfigInfo *pGSCI = GPU_GET_GSP_STATIC_INFO(pGpu); pGpu->setProperty(pGpu, PDB_PROP_GPU_IS_MOBILE, pGSCI->bIsMobile); - pGpu->setProperty(pGpu, PDB_PROP_GPU_RTD3_GC6_SUPPORTED, pGSCI->bIsGc6Rtd3Allowed); - pGpu->setProperty(pGpu, PDB_PROP_GPU_RTD3_GC8_SUPPORTED, pGSCI->bIsGc8Rtd3Allowed); - pGpu->setProperty(pGpu, PDB_PROP_GPU_RTD3_GCOFF_SUPPORTED, pGSCI->bIsGcOffRtd3Allowed); + pGpu->setProperty(pGpu, PDB_PROP_GPU_RTD3_GC6_SUPPORTED, pGSCI->bIsGc6Rtd3Allowed && !pGpu->getProperty(pGpu, PDB_PROP_GPU_IS_EXTERNAL_GPU)); + pGpu->setProperty(pGpu, PDB_PROP_GPU_RTD3_GC8_SUPPORTED, pGSCI->bIsGc8Rtd3Allowed && !pGpu->getProperty(pGpu, PDB_PROP_GPU_IS_EXTERNAL_GPU)); + pGpu->setProperty(pGpu, PDB_PROP_GPU_RTD3_GCOFF_SUPPORTED, pGSCI->bIsGcOffRtd3Allowed && !pGpu->getProperty(pGpu, PDB_PROP_GPU_IS_EXTERNAL_GPU)); pGpu->setProperty(pGpu, PDB_PROP_GPU_IS_UEFI, pGSCI->bIsGpuUefi); pGpu->setProperty(pGpu, PDB_PROP_GPU_IS_EFI_INIT, pGSCI->bIsEfiInit); pGpu->setProperty(pGpu, PDB_PROP_GPU_LEGACY_GCOFF_SUPPORTED, pGSCI->bIsGcoffLegacyAllowed);