Skip to content

Commit 30e7a6d

Browse files
committed
nvidia: add NVreg_ForceExternalGpu module parameter
Thunderbolt 4/5 eGPU enclosures fail automatic external GPU detection because they are not in the approved TB3 bridge list and do not report the required slot capabilities (HotPlug+ and Surprise+). Add NVreg_ForceExternalGpu parameter to bypass bridge detection and unconditionally set PDB_PROP_GPU_IS_EXTERNAL_GPU, enabling proper eGPU handling throughout the driver.
1 parent a5bfb10 commit 30e7a6d

File tree

3 files changed

+70
-3
lines changed

3 files changed

+70
-3
lines changed

kernel-open/nvidia/nv-reg.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,28 @@
672672
#define NV_REG_TEGRA_GPU_PG_MASK \
673673
NV_REG_STRING(__NV_TEGRA_GPU_PG_MASK)
674674

675+
/*
676+
* Option: ForceExternalGpu
677+
*
678+
* Description:
679+
*
680+
* When this option is enabled, the NVIDIA driver will treat all GPUs as
681+
* external GPUs (eGPU), bypassing the automatic Thunderbolt bridge detection.
682+
* This is useful for Thunderbolt 4/5 enclosures that are not in the driver's
683+
* approved bridge whitelist.
684+
*
685+
* When enabled, the Platform Request Handler (power management) is disabled
686+
* for these GPUs, which can prevent link training issues on eGPU setups.
687+
*
688+
* Possible values:
689+
*
690+
* 0 - use automatic eGPU detection (default)
691+
* 1 - force all GPUs to be treated as external GPUs
692+
*/
693+
694+
#define __NV_FORCE_EXTERNAL_GPU ForceExternalGpu
695+
#define NV_REG_FORCE_EXTERNAL_GPU NV_REG_STRING(__NV_FORCE_EXTERNAL_GPU)
696+
675697
/*
676698
* Option: RegisterPCIDriver
677699
*
@@ -1000,6 +1022,7 @@ NV_DEFINE_REG_ENTRY(__NV_DYNAMIC_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD, 200);
10001022
NV_DEFINE_REG_ENTRY(__NV_ENABLE_GPU_FIRMWARE, NV_REG_ENABLE_GPU_FIRMWARE_DEFAULT_VALUE);
10011023
NV_DEFINE_REG_ENTRY(__NV_ENABLE_GPU_FIRMWARE_LOGS, NV_REG_ENABLE_GPU_FIRMWARE_LOGS_ENABLE_ON_DEBUG);
10021024
NV_DEFINE_REG_ENTRY(__NV_OPENRM_ENABLE_UNSUPPORTED_GPUS, 1);
1025+
NV_DEFINE_REG_ENTRY(__NV_FORCE_EXTERNAL_GPU, 0);
10031026

10041027
NV_DEFINE_REG_ENTRY_GLOBAL(__NV_ENABLE_USER_NUMA_MANAGEMENT, 1);
10051028
NV_DEFINE_REG_ENTRY_GLOBAL(__NV_MEMORY_POOL_SIZE, 0);
@@ -1076,6 +1099,7 @@ nv_parm_t nv_parms[] = {
10761099
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_RM_NVLINK_BW_LINK_COUNT),
10771100
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_DBG_BREAKPOINT),
10781101
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_OPENRM_ENABLE_UNSUPPORTED_GPUS),
1102+
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_FORCE_EXTERNAL_GPU),
10791103
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_DMA_REMAP_PEER_MMIO),
10801104
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_IMEX_CHANNEL_COUNT),
10811105
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_CREATE_IMEX_CHANNEL_0),

src/nvidia/arch/nvalloc/unix/include/nv-reg.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,28 @@
672672
#define NV_REG_TEGRA_GPU_PG_MASK \
673673
NV_REG_STRING(__NV_TEGRA_GPU_PG_MASK)
674674

675+
/*
676+
* Option: ForceExternalGpu
677+
*
678+
* Description:
679+
*
680+
* When this option is enabled, the NVIDIA driver will treat all GPUs as
681+
* external GPUs (eGPU), bypassing the automatic Thunderbolt bridge detection.
682+
* This is useful for Thunderbolt 4/5 enclosures that are not in the driver's
683+
* approved bridge whitelist.
684+
*
685+
* When enabled, the Platform Request Handler (power management) is disabled
686+
* for these GPUs, which can prevent link training issues on eGPU setups.
687+
*
688+
* Possible values:
689+
*
690+
* 0 - use automatic eGPU detection (default)
691+
* 1 - force all GPUs to be treated as external GPUs
692+
*/
693+
694+
#define __NV_FORCE_EXTERNAL_GPU ForceExternalGpu
695+
#define NV_REG_FORCE_EXTERNAL_GPU NV_REG_STRING(__NV_FORCE_EXTERNAL_GPU)
696+
675697
/*
676698
* Option: RegisterPCIDriver
677699
*
@@ -1000,6 +1022,7 @@ NV_DEFINE_REG_ENTRY(__NV_DYNAMIC_POWER_MANAGEMENT_VIDEO_MEMORY_THRESHOLD, 200);
10001022
NV_DEFINE_REG_ENTRY(__NV_ENABLE_GPU_FIRMWARE, NV_REG_ENABLE_GPU_FIRMWARE_DEFAULT_VALUE);
10011023
NV_DEFINE_REG_ENTRY(__NV_ENABLE_GPU_FIRMWARE_LOGS, NV_REG_ENABLE_GPU_FIRMWARE_LOGS_ENABLE_ON_DEBUG);
10021024
NV_DEFINE_REG_ENTRY(__NV_OPENRM_ENABLE_UNSUPPORTED_GPUS, 1);
1025+
NV_DEFINE_REG_ENTRY(__NV_FORCE_EXTERNAL_GPU, 0);
10031026

10041027
NV_DEFINE_REG_ENTRY_GLOBAL(__NV_ENABLE_USER_NUMA_MANAGEMENT, 1);
10051028
NV_DEFINE_REG_ENTRY_GLOBAL(__NV_MEMORY_POOL_SIZE, 0);
@@ -1076,6 +1099,7 @@ nv_parm_t nv_parms[] = {
10761099
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_RM_NVLINK_BW_LINK_COUNT),
10771100
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_ENABLE_DBG_BREAKPOINT),
10781101
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_OPENRM_ENABLE_UNSUPPORTED_GPUS),
1102+
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_FORCE_EXTERNAL_GPU),
10791103
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_DMA_REMAP_PEER_MMIO),
10801104
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_IMEX_CHANNEL_COUNT),
10811105
NV_DEFINE_PARAMS_TABLE_ENTRY(__NV_CREATE_IMEX_CHANNEL_0),

src/nvidia/arch/nvalloc/unix/src/osinit.c

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1310,10 +1310,29 @@ RmInitNvDevice(
13101310
}
13111311

13121312
// Configure eGPU setting
1313-
if (RmCheckForExternalGpu(pGpu, pCl))
13141313
{
1315-
pGpu->setProperty(pGpu, PDB_PROP_GPU_IS_EXTERNAL_GPU, NV_TRUE);
1316-
nv->is_external_gpu = NV_TRUE;
1314+
NvU32 forceExternalGpu = 0;
1315+
NvBool isExternalGpu = NV_FALSE;
1316+
1317+
// Check if user has forced eGPU mode via module parameter
1318+
if ((osReadRegistryDword(pGpu, NV_REG_FORCE_EXTERNAL_GPU, &forceExternalGpu) == NV_OK) &&
1319+
(forceExternalGpu != 0))
1320+
{
1321+
NV_PRINTF(LEVEL_NOTICE, "Forcing external GPU mode via NVreg_ForceExternalGpu\n");
1322+
isExternalGpu = NV_TRUE;
1323+
}
1324+
else
1325+
{
1326+
// Otherwise, use automatic detection
1327+
isExternalGpu = RmCheckForExternalGpu(pGpu, pCl);
1328+
}
1329+
1330+
if (isExternalGpu)
1331+
{
1332+
NV_PRINTF(LEVEL_NOTICE, "GPU treated as external GPU (eGPU)\n");
1333+
pGpu->setProperty(pGpu, PDB_PROP_GPU_IS_EXTERNAL_GPU, NV_TRUE);
1334+
nv->is_external_gpu = NV_TRUE;
1335+
}
13171336
}
13181337
status->rmStatus = gpumgrStateInitGpu(pGpu);
13191338
if (status->rmStatus != NV_OK)

0 commit comments

Comments
 (0)