diff --git a/kernel/gpu_unlock/arch_610.h b/kernel/gpu_unlock/arch_610.h index 55f28d5..8b1b818 100644 --- a/kernel/gpu_unlock/arch_610.h +++ b/kernel/gpu_unlock/arch_610.h @@ -10,4 +10,7 @@ enum gpu_unlock_booter_arch { /* Exact experimental AD103 canary; other Ada PCI IDs are not admitted. */ #define GU_AD103_RTX_4070_TI_SUPER 0x2705u +/* RTX 4090 D is an exact-card experiment using AD102 assets. */ +#define GU_AD102_RTX_4090_D 0x2685u + #endif diff --git a/kernel/gpu_unlock/main.c b/kernel/gpu_unlock/main.c index 919ad91..8d8ce77 100644 --- a/kernel/gpu_unlock/main.c +++ b/kernel/gpu_unlock/main.c @@ -16,6 +16,10 @@ static bool ad103_experimental; module_param(ad103_experimental, bool, 0444); MODULE_PARM_DESC(ad103_experimental, "permit only the exact 10de:2705 AD103 canary with a single explicit PCI address"); +static bool ad102d_experimental; +module_param(ad102d_experimental, bool, 0444); +MODULE_PARM_DESC(ad102d_experimental, "permit only the exact 10de:2685 RTX 4090 D with a single explicit PCI address"); + /* RTX 4090 and supported desktop GA102/GA103/GA104/GA106 GPU functions. * Professional parts already have full FP32-accumulate tensor issue rate. */ @@ -47,6 +51,8 @@ static bool supported(const struct pci_dev *pdev) if (pdev->device == GU_AD103_RTX_4070_TI_SUPER) return ad103_experimental; + if (pdev->device == GU_AD102_RTX_4090_D) + return ad102d_experimental; for (i = 0; i < ARRAY_SIZE(supported_ids); i++) if (pdev->device == supported_ids[i]) return true; @@ -126,6 +132,11 @@ static int __init gpu_unlock_init(void) if (!all) report_unmatched(); while ((pdev = next_supported(pdev))) { + if (pdev->device == GU_AD102_RTX_4090_D && + (all || strcasecmp(targets, pci_name(pdev)))) { + pci_err(pdev, "gpu_unlock: experimental RTX 4090 D requires a single exact PCI target\n"); + continue; + } if (pdev->device == GU_AD103_RTX_4070_TI_SUPER && (all || strcasecmp(targets, pci_name(pdev)))) { pci_err(pdev, "gpu_unlock: experimental AD103 requires a single exact PCI target\n"); diff --git a/kernel/gpu_unlock/unlock_610.c b/kernel/gpu_unlock/unlock_610.c index 5c668c4..8f27f75 100644 --- a/kernel/gpu_unlock/unlock_610.c +++ b/kernel/gpu_unlock/unlock_610.c @@ -73,6 +73,7 @@ static const struct gpu_unlock_assets *unlock_assets(const struct pci_dev *pdev) }; return (pdev->device == GU_AD102_RTX_4090 || + pdev->device == GU_AD102_RTX_4090_D || pdev->device == GU_AD103_RTX_4070_TI_SUPER) ? &ad102 : &ga102; } @@ -317,6 +318,7 @@ static bool is_ad102(const struct unlock_transaction_work *work) /* AD103 uses the same pinned AD102-family Booter archive. Hardware * behavior on 0x2705 still requires an exact-card canary. */ return work->pdev->device == GU_AD102_RTX_4090 || + work->pdev->device == GU_AD102_RTX_4090_D || work->pdev->device == GU_AD103_RTX_4070_TI_SUPER; } diff --git a/tests/test_ad102_kernel.c b/tests/test_ad102_kernel.c index 8f011f9..2f37865 100644 --- a/tests/test_ad102_kernel.c +++ b/tests/test_ad102_kernel.c @@ -37,6 +37,11 @@ static void prepare_boot(struct unlock_transaction_work *w) int main(int argc, char **argv) { struct unlock_transaction_work w; + ad102_setup(&w); + dev.device=0x2685; + assert(is_ad102(&w)); + assert(unlock_assets(&dev)->arch==GU_BOOTER_AD10X); + assert(!strcmp(unlock_assets(&dev)->signature_section,".fwsignature_ad10x")); /* Required permissions are exact; FBPA is observational. Missing/wrong * markers, ignored stores, live SEC2 and inaccessible BAR views all stop * before either selector. No failure grants DMA cleanup authority. */ @@ -145,7 +150,9 @@ int main(int argc, char **argv) } /* Dispatch the same published AD102-family payload through the exact * 0x2705 profile under mocked registers. This is not silicon proof. */ - ad102_setup(&w);dev.device=GU_AD103_RTX_4070_TI_SUPER;load_rom(argv[1]); + const unsigned short extra_ids[]={GU_AD103_RTX_4070_TI_SUPER,0x2685}; + for(unsigned id=0;id